namespace SIGCM2.Domain.Entities;

/// <summary>
/// Punto de Venta AFIP vinculado a un Medio. Gestiona comprobantes fiscales.
/// Identidad por Id (IDENTITY). NumeroAFIP único por Medio (enforced por UNIQUE(MedioId,NumeroAFIP) en BD).
/// </summary>
public sealed class PuntoDeVenta
{
    public int Id { get; }
    public int MedioId { get; }
    public short NumeroAFIP { get; }
    public string Nombre { get; }
    public string? Descripcion { get; }
    public bool Activo { get; }
    public DateTime FechaCreacion { get; }
    public DateTime? FechaModificacion { get; }

    public PuntoDeVenta(
        int id,
        int medioId,
        short numeroAFIP,
        string nombre,
        string? descripcion,
        bool activo,
        DateTime fechaCreacion,
        DateTime? fechaModificacion)
    {
        Id = id;
        MedioId = medioId;
        NumeroAFIP = numeroAFIP;
        Nombre = nombre;
        Descripcion = descripcion;
        Activo = activo;
        FechaCreacion = fechaCreacion;
        FechaModificacion = fechaModificacion;
    }

    /// <summary>
    /// Factory para crear un nuevo PdV (Id=0 — BD asigna via IDENTITY; Activo=true; FechaCreacion por DF de BD).
    /// </summary>
    public static PuntoDeVenta ForCreation(int medioId, short numeroAFIP, string nombre, string? descripcion)
        => new(
            id: 0,
            medioId: medioId,
            numeroAFIP: numeroAFIP,
            nombre: nombre,
            descripcion: descripcion,
            activo: true,
            fechaCreacion: default,
            fechaModificacion: null);

    /// <summary>
    /// Retorna una nueva instancia con nombre, numeroAFIP y descripcion actualizados.
    /// MedioId es inmutable (enforce en BD).
    /// Caller is responsible for passing the current UTC timestamp via TimeProvider.GetUtcNow().UtcDateTime.
    /// </summary>
    public PuntoDeVenta WithUpdatedProfile(string nombre, short numeroAFIP, string? descripcion, DateTime now)
        => new(
            id: Id,
            medioId: MedioId,
            numeroAFIP: numeroAFIP,
            nombre: nombre,
            descripcion: descripcion,
            activo: Activo,
            fechaCreacion: FechaCreacion,
            fechaModificacion: now);

    public PuntoDeVenta WithActivo(bool activo, DateTime now)
        => new(
            id: Id,
            medioId: MedioId,
            numeroAFIP: NumeroAFIP,
            nombre: Nombre,
            descripcion: Descripcion,
            activo: activo,
            fechaCreacion: FechaCreacion,
            fechaModificacion: now);
}
