module profile.data;

import handy_http_primitives : Optional;

import profile.model;

/// Repository for interacting with the set of profiles belonging to a user.
interface ProfileRepository {
    Optional!Profile findByName(string name);
    Profile createProfile(string name);
    Profile[] findAll();
    void deleteByName(string name);
    ProfileDataSource getDataSource(in Profile profile);
}

/// Repository for accessing the properties of a profile.
interface PropertiesRepository {
    Optional!string findProperty(string propertyName);
    void setProperty(string name, string value);
    void deleteProperty(string name);
    ProfileProperty[] findAll();
}

/**
 * A data source for all data contained within a profile. This serves as the
 * gateway for all data access operations for a profile.
 */
interface ProfileDataSource {
    import account.data;
    import transaction.data;

    PropertiesRepository getPropertiesRepository();
    
    AccountRepository getAccountRepository();
    AccountJournalEntryRepository getAccountJournalEntryRepository();
    
    TransactionVendorRepository getTransactionVendorRepository();
    TransactionCategoryRepository getTransactionCategoryRepository();
    TransactionTagRepository getTransactionTagRepository();
    TransactionRepository getTransactionRepository();

    void doTransaction(void delegate () dg);
}
