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

namespace GestionIntegral.Api.Data.Repositories.Contables
{
    public interface ICierreCuentaCorrienteRepository
    {
        Task<CierreCuentaCorriente?> GetByIdAsync(int idCierre);

        // Devuelve el último cierre con Estado = 'Activo' para el par (Distribuidor + Empresa).
        // Acepta una transacción opcional para usarse dentro del flujo Crear/Reabrir.
        Task<CierreCuentaCorriente?> GetUltimoCierreVigenteAsync(int idDistribuidor, int idEmpresa, IDbTransaction? transaction = null);

        // Verifica si la fecha cae dentro de un período cerrado: existe un cierre Activo con FechaCorte >= fechaOperacion.
        Task<CierreCuentaCorriente?> GetCierreVigenteParaFechaAsync(int idDistribuidor, int idEmpresa, DateTime fechaOperacion);

        // True si existe otro cierre Activo con FechaCorte > fechaCorte (excluyendo opcionalmente un cierre puntual).
        // Se usa al reabrir para forzar la cascada manual.
        Task<bool> ExisteCierrePosteriorVigenteAsync(int idDistribuidor, int idEmpresa, DateTime fechaCorte, int? excluirIdCierre = null, IDbTransaction? transaction = null);

        // Crea la fila maestra y registra la entrada inicial en _H con TipoMod='Creacion'. Devuelve el Id_Cierre generado.
        Task<int> CreateAsync(CierreCuentaCorriente cierre, int idUsuarioMod, IDbTransaction transaction);

        // Marca un cierre como Anulado (UPDATE atómico solo si Estado='Activo') y registra entrada en _H con TipoMod='Reapertura'.
        // Devuelve true si se anuló (Estado pasó de Activo a Anulado), false si ya estaba anulado o no existía.
        Task<bool> AnularAsync(int idCierre, int idUsuarioAnula, string justificacionAnulacion, int idUsuarioMod, IDbTransaction transaction);

        Task<IEnumerable<CierreCuentaCorrienteDto>> GetAllAsync(
            int? idDistribuidor, int? idEmpresa, string? estado,
            DateTime? fechaCorteDesde, DateTime? fechaCorteHasta);

        Task<IEnumerable<CierreCuentaCorrienteHistorialDto>> GetHistorialAsync(int idCierre);

        // Auditoría general: filtra el historial cruzado de todos los cierres por rango de FechaMod, usuario, tipo, y opcional Id_Cierre.
        Task<IEnumerable<CierreCuentaCorrienteHistorialDto>> ObtenerHistorialAsync(
            DateTime? fechaDesde, DateTime? fechaHasta,
            int? idUsuarioModifico, string? tipoModificacion,
            int? idCierreAfectado);
    }
}
