namespace SIGCM2.Domain.Entities;

public sealed class Seccion
{
    public int Id { get; }
    public int MedioId { get; }
    public string Codigo { get; }
    public string Nombre { get; }
    public string Tipo { get; }        // 'clasificados' | 'notables' | 'suplementos' — enforzado por CHECK en BD
    public bool Activo { get; }
    public DateTime FechaCreacion { get; }
    public DateTime? FechaModificacion { get; }

    public Seccion(
        int id,
        int medioId,
        string codigo,
        string nombre,
        string tipo,
        bool activo,
        DateTime fechaCreacion,
        DateTime? fechaModificacion)
    {
        Id = id;
        MedioId = medioId;
        Codigo = codigo;
        Nombre = nombre;
        Tipo = tipo;
        Activo = activo;
        FechaCreacion = fechaCreacion;
        FechaModificacion = fechaModificacion;
    }

    public static Seccion ForCreation(int medioId, string codigo, string nombre, string tipo)
    {
        return new Seccion(
            id: 0,
            medioId: medioId,
            codigo: codigo,
            nombre: nombre,
            tipo: tipo,
            activo: true,
            fechaCreacion: default,
            fechaModificacion: null);
    }

    /// <summary>
    /// Returns a new instance with updated fields. MedioId and Codigo are immutable.
    /// Caller is responsible for passing the current UTC timestamp via TimeProvider.GetUtcNow().UtcDateTime.
    /// </summary>
    public Seccion WithUpdatedProfile(string nombre, string tipo, DateTime now)
        => new(
            id: Id,
            medioId: MedioId,
            codigo: Codigo,
            nombre: nombre,
            tipo: tipo,
            activo: Activo,
            fechaCreacion: FechaCreacion,
            fechaModificacion: now);

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