using SIGCM2.Application.IngresosBrutos.Dtos;
using SIGCM2.Application.TiposDeIva.Dtos;
using SIGCM2.Domain.Fiscal;

namespace SIGCM2.Api.Contracts.Fiscal;

// ── IVA Request records ───────────────────────────────────────────────────────

/// <summary>ADM-009: Create TipoDeIva request body.</summary>
public sealed record CreateTipoDeIvaRequest(
    string? Codigo,
    string? Descripcion,
    decimal? Porcentaje,
    bool? AplicaIVA,
    string? VigenciaDesde,
    string? VigenciaHasta = null);

/// <summary>
/// ADM-009: Update TipoDeIva request body — only cosmetic fields.
/// Porcentaje is intentionally absent; any attempt to pass it in the body
/// is detected via raw JSON inspection and returns 409.
/// </summary>
public sealed record UpdateTipoDeIvaRequest(
    string? Codigo,
    string? Descripcion,
    bool? AplicaIVA,
    bool? Activo);

/// <summary>ADM-009: Create new TipoDeIva version request body.</summary>
public sealed record NuevaVersionTipoDeIvaRequest(
    decimal? Porcentaje,
    string? VigenciaDesde);

// ── IIBB Request records ──────────────────────────────────────────────────────

/// <summary>ADM-009: Create IngresosBrutos request body.</summary>
public sealed record CreateIngresosBrutosRequest(
    string? Provincia,
    string? Descripcion,
    decimal? Alicuota,
    string? VigenciaDesde,
    string? VigenciaHasta = null);

/// <summary>
/// ADM-009: Update IngresosBrutos request body — only cosmetic fields.
/// Alicuota and Provincia are intentionally absent.
/// </summary>
public sealed record UpdateIngresosBrutosRequest(
    string? Descripcion,
    bool? Activo);

/// <summary>ADM-009: Create new IngresosBrutos version request body.</summary>
public sealed record NuevaVersionIngresosBrutosRequest(
    decimal? Alicuota,
    string? VigenciaDesde);

// ── Shared Response records ───────────────────────────────────────────────────

/// <summary>ADM-009: Response for nueva-version operations.</summary>
public sealed record NuevaVersionResponse(
    int PredecesoraId,
    int NuevaVersionId);

// ── Mapper ────────────────────────────────────────────────────────────────────

/// <summary>
/// Maps Application-layer DTOs to API response shapes.
/// Application DTOs are already well-formed for most cases;
/// IIBB Provincia is mapped to its display string for the API.
/// </summary>
public static class FiscalContractMapper
{
    public static object ToIvaResponse(TipoDeIvaDto dto) => new
    {
        dto.Id,
        dto.Codigo,
        dto.Descripcion,
        dto.Porcentaje,
        dto.AplicaIVA,
        dto.Activo,
        dto.VigenciaDesde,
        dto.VigenciaHasta,
        dto.PredecesorId,
        dto.FechaCreacion,
        dto.FechaModificacion
    };

    public static object ToIibbResponse(IngresosBrutosDto dto) => new
    {
        dto.Id,
        Provincia = dto.Provincia.ToDisplayString(),
        dto.Descripcion,
        dto.Alicuota,
        dto.Activo,
        dto.VigenciaDesde,
        dto.VigenciaHasta,
        dto.PredecesorId,
        dto.FechaCreacion,
        dto.FechaModificacion
    };

    public static object ToHistorialIvaResponse(HistorialCadenaDto dto) => new
    {
        dto.Id,
        dto.Codigo,
        dto.Porcentaje,
        dto.VigenciaDesde,
        dto.VigenciaHasta,
        dto.PredecesorId,
        dto.Version
    };

    public static object ToHistorialIibbResponse(HistorialCadenaIibbDto dto) => new
    {
        dto.Id,
        Provincia = dto.Provincia.ToDisplayString(),
        dto.Alicuota,
        dto.VigenciaDesde,
        dto.VigenciaHasta,
        dto.PredecesorId,
        dto.Version
    };
}
