namespace SIGCM2.Domain.Entities;

public sealed class Medio
{
    public int Id { get; }
    public string Codigo { get; }
    public string Nombre { get; }
    public TipoMedio Tipo { get; }
    public int? PlataformaEmpresaId { get; }
    public bool Activo { get; }
    public DateTime FechaCreacion { get; }
    public DateTime? FechaModificacion { get; }

    public Medio(
        int id,
        string codigo,
        string nombre,
        TipoMedio tipo,
        int? plataformaEmpresaId,
        bool activo,
        DateTime fechaCreacion,
        DateTime? fechaModificacion)
    {
        Id = id;
        Codigo = codigo;
        Nombre = nombre;
        Tipo = tipo;
        PlataformaEmpresaId = plataformaEmpresaId;
        Activo = activo;
        FechaCreacion = fechaCreacion;
        FechaModificacion = fechaModificacion;
    }

    /// <summary>
    /// Factory for creating a new Medio (Id=0 — DB assigns via IDENTITY; Activo=true; FechaCreacion set by DB default).
    /// </summary>
    public static Medio ForCreation(string codigo, string nombre, TipoMedio tipo, int? plataformaEmpresaId)
    {
        return new Medio(
            id: 0,
            codigo: codigo,
            nombre: nombre,
            tipo: tipo,
            plataformaEmpresaId: plataformaEmpresaId,
            activo: true,
            fechaCreacion: default,
            fechaModificacion: null);
    }

    /// <summary>
    /// Returns a new instance with updated fields. Codigo is immutable (use BD UQ to enforce).
    /// Caller is responsible for passing the current UTC timestamp via TimeProvider.GetUtcNow().UtcDateTime.
    /// </summary>
    public Medio WithUpdatedProfile(string nombre, TipoMedio tipo, int? plataformaEmpresaId, DateTime now)
        => new(
            id: Id,
            codigo: Codigo,
            nombre: nombre,
            tipo: tipo,
            plataformaEmpresaId: plataformaEmpresaId,
            activo: Activo,
            fechaCreacion: FechaCreacion,
            fechaModificacion: now);

    public Medio WithActivo(bool activo, DateTime now)
        => new(
            id: Id,
            codigo: Codigo,
            nombre: Nombre,
            tipo: Tipo,
            plataformaEmpresaId: PlataformaEmpresaId,
            activo: activo,
            fechaCreacion: FechaCreacion,
            fechaModificacion: now);
}
