namespace MyOffice.Data.Repositories.Account;

using Models.Accounts;

public interface IAccountRepository
{
	List<Account> GetAll(Guid userId);
	Task<List<Account>> GetAllAsync(Guid userId, CancellationToken cancellationToken = default);
	List<Account> GetByCategory(Guid userId, Guid categoryId);
	Task<List<Account>> GetByCategoryAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default);
	List<AccountDetailed> GetByCategoryDetailed(Guid userId, Guid categoryId);
	Task<List<AccountDetailed>> GetByCategoryDetailedAsync(Guid userId, Guid categoryId, CancellationToken cancellationToken = default);
	AccountDetailed? GetByIdDetailed(Guid userId, Guid id);
	Task<AccountDetailed?> GetByIdDetailedAsync(Guid userId, Guid id, CancellationToken cancellationToken = default);
	bool Add(Account account);
	Task<bool> AddAsync(Account account, CancellationToken cancellationToken = default);
	bool Delete(Account account);
	Task<bool> DeleteAsync(Account account, CancellationToken cancellationToken = default);
	Account? Get(Guid userId, Guid id);
	Task<Account?> GetAsync(Guid userId, Guid id, CancellationToken cancellationToken = default);
	bool Update(Account account);
	Task<bool> UpdateAsync(Account account, CancellationToken cancellationToken = default);
	bool Remove(Account account);
	List<Account> FindAccounts(Guid userId, string term);
	Task<List<Account>> FindAccountsAsync(Guid userId, string term, CancellationToken cancellationToken = default);

	List<AccountSimple> GetRestAtDate(Guid userId, DateTime date);
	Task<List<AccountSimple>> GetRestAtDateAsync(Guid userId, DateTime date, CancellationToken cancellationToken = default);
	List<MotionTotalSimple> GetIncomeByCategories(Guid userId, DateTime from, DateTime to);
	Task<List<MotionTotalSimple>> GetIncomeByCategoriesAsync(Guid userId, DateTime from, DateTime to, CancellationToken cancellationToken = default);
	List<MotionTotalSimple> GetIncomeByCategory(Guid userId, Guid categoryId, DateTime from, DateTime to);
	Task<List<MotionTotalSimple>> GetIncomeByCategoryAsync(Guid userId, Guid categoryId, DateTime from, DateTime to, CancellationToken cancellationToken = default);
	List<MotionTotalSimple> GetOutcomeByCategories(Guid userId, DateTime from, DateTime to);
	Task<List<MotionTotalSimple>> GetOutcomeByCategoriesAsync(Guid userId, DateTime from, DateTime to, CancellationToken cancellationToken = default);
	List<MotionTotalSimple> GetOutcomeByCategory(Guid userId, Guid categoryId, DateTime from, DateTime to);
	Task<List<MotionTotalSimple>> GetOutcomeByCategoryAsync(Guid userId, Guid categoryId, DateTime from, DateTime to, CancellationToken cancellationToken = default);
}