using GestionIntegral.Api.Models.Distribucion;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Data;
using GestionIntegral.Api.Dtos.Distribucion;

namespace GestionIntegral.Api.Data.Repositories.Distribucion
{
    public interface IDistribuidorRepository
    {
        Task<IEnumerable<(Distribuidor Distribuidor, string? NombreZona)>> GetAllAsync(string? nombreFilter, string? nroDocFilter, bool? soloActivos = true);
        Task<(Distribuidor? Distribuidor, string? NombreZona)> GetByIdAsync(int id);
        Task<Distribuidor?> GetByIdSimpleAsync(int id); // Para uso interno en el servicio
        Task<Distribuidor?> CreateAsync(Distribuidor nuevoDistribuidor, int idUsuario, IDbTransaction transaction);
        Task<bool> UpdateAsync(Distribuidor distribuidorAActualizar, int idUsuario, IDbTransaction transaction);
        Task<bool> DeleteAsync(int id, int idUsuario, IDbTransaction transaction);
        Task<bool> ToggleBajaAsync(int id, bool darDeBaja, DateTime? fechaBaja, int idUsuario, IDbTransaction transaction);
        Task<bool> ExistsByNroDocAsync(string nroDoc, int? excludeIdDistribuidor = null);
        Task<bool> ExistsByNameAsync(string nombre, int? excludeIdDistribuidor = null);
        Task<bool> IsInUseAsync(int id); // Verificar en dist_EntradasSalidas, cue_PagosDistribuidor, dist_PorcPago
        Task<IEnumerable<DistribuidorDropdownDto?>> GetAllDropdownAsync(bool? soloActivos = true);
        Task<DistribuidorLookupDto?> ObtenerLookupPorIdAsync(int id);
        Task<IEnumerable<(DistribuidorHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
        DateTime? fechaDesde, DateTime? fechaHasta,
        int? idUsuarioModifico, string? tipoModificacion,
        int? idDistribuidorOriginal);
    }
}