using System.Threading.Tasks;
using System.Collections.Generic; // Para IEnumerable
using System.Data;
using GestionIntegral.Api.Dtos.Contables; // Para SaldoGestionDto si lo usas aquí
using GestionIntegral.Api.Models.Contables; // Para Saldo, SaldoAjusteHistorial

namespace GestionIntegral.Api.Data.Repositories.Contables
{
    public interface ISaldoRepository
    {
        // Necesitaremos un método para obtener los IDs de los distribuidores
        Task<IEnumerable<int>> GetAllDistribuidorIdsAsync();
        // Método para crear el saldo inicial (podría devolver bool o int)
        Task<bool> CreateSaldoInicialAsync(string destino, int idDestino, int idEmpresa, IDbTransaction transaction); // Transacción es clave
        // Método para eliminar saldos por IdEmpresa (y opcionalmente por Destino/IdDestino)
        Task<bool> DeleteSaldosByEmpresaAsync(int idEmpresa, IDbTransaction transaction); // Transacción es clave
                                                                                          // Método para modificar saldo (lo teníamos como privado antes, ahora en el repo)
        Task<bool> ModificarSaldoAsync(string destino, int idDestino, int idEmpresa, decimal montoAAgregar, IDbTransaction? transaction = null);
        Task<bool> CheckIfSaldosExistForEmpresaAsync(int id);

        // Para obtener la lista de saldos para la página de gestión
        Task<IEnumerable<Saldo>> GetSaldosParaGestionAsync(string? destinoFilter, int? idDestinoFilter, int? idEmpresaFilter);
        // Para obtener un saldo específico (ya podría existir uno similar, o crearlo si es necesario)
        Task<Saldo?> GetSaldoAsync(string destino, int idDestino, int idEmpresa, IDbTransaction? transaction = null);
        // Para registrar el historial de ajuste
        Task CreateSaldoAjusteHistorialAsync(SaldoAjusteHistorial historialEntry, IDbTransaction transaction);
        Task<IEnumerable<(SaldoAjusteHistorial Historial, string NombreUsuarioModifico)>> GetHistorialAjustesAsync(
        DateTime? fechaDesde, DateTime? fechaHasta,
        int? idUsuarioModifico,
        string? destino, int? idDestino, int? idEmpresa);
    }
}