using SIGCM2.Domain.Entities;

namespace SIGCM2.Application.Tests.Domain;

public class RolTests
{
    // Happy path: full constructor sets all properties.
    [Fact]
    public void Constructor_SetsAllProperties()
    {
        var created = new DateTime(2026, 4, 15, 10, 0, 0, DateTimeKind.Utc);
        var modified = new DateTime(2026, 4, 15, 11, 0, 0, DateTimeKind.Utc);

        var rol = new Rol(
            id: 1,
            codigo: "cajero",
            nombre: "Cajero",
            descripcion: "Atención de mostrador",
            activo: true,
            fechaCreacion: created,
            fechaModificacion: modified
        );

        Assert.Equal(1, rol.Id);
        Assert.Equal("cajero", rol.Codigo);
        Assert.Equal("Cajero", rol.Nombre);
        Assert.Equal("Atención de mostrador", rol.Descripcion);
        Assert.True(rol.Activo);
        Assert.Equal(created, rol.FechaCreacion);
        Assert.Equal(modified, rol.FechaModificacion);
    }

    // Triangulation: descripcion is nullable, fechaModificacion is nullable.
    [Fact]
    public void Constructor_WithNullOptionals_SetsNulls()
    {
        var created = new DateTime(2026, 4, 15, 10, 0, 0, DateTimeKind.Utc);

        var rol = new Rol(
            id: 2,
            codigo: "reportes",
            nombre: "Reportes",
            descripcion: null,
            activo: false,
            fechaCreacion: created,
            fechaModificacion: null
        );

        Assert.Null(rol.Descripcion);
        Assert.Null(rol.FechaModificacion);
        Assert.False(rol.Activo);
    }

    // ForCreation: Id=0 (IDENTITY assigned by DB), Activo=true, FechaCreacion=SYSUTCDATETIME-ish (not set here), FechaModificacion=null.
    [Fact]
    public void ForCreation_ReturnsNewInstanceWithDefaults()
    {
        var rol = Rol.ForCreation(
            codigo: "picadora",
            nombre: "Picadora/Correctora",
            descripcion: "Edición de textos"
        );

        Assert.Equal(0, rol.Id);
        Assert.Equal("picadora", rol.Codigo);
        Assert.Equal("Picadora/Correctora", rol.Nombre);
        Assert.Equal("Edición de textos", rol.Descripcion);
        Assert.True(rol.Activo);
        Assert.Null(rol.FechaModificacion);
    }

    // Triangulation: ForCreation accepts null descripcion.
    [Fact]
    public void ForCreation_WithNullDescripcion_AllowsNull()
    {
        var rol = Rol.ForCreation(codigo: "admin", nombre: "Administrador", descripcion: null);

        Assert.Null(rol.Descripcion);
        Assert.Equal("admin", rol.Codigo);
        Assert.True(rol.Activo);
    }
}
