using FluentAssertions;
using SIGCM2.Domain.Exceptions;

namespace SIGCM2.Application.Tests.Domain.ProductTypes;

public class ProductTypeExceptionsTests
{
    // ── ProductTypeNotFoundException ──────────────────────────────────────────

    [Fact]
    public void ProductTypeNotFoundException_ContainsIdInMessage()
    {
        var ex = new ProductTypeNotFoundException(42);

        ex.Message.Should().Contain("42");
    }

    [Fact]
    public void ProductTypeNotFoundException_ExposesProductTypeId()
    {
        var ex = new ProductTypeNotFoundException(99);

        ex.ProductTypeId.Should().Be(99);
    }

    [Fact]
    public void ProductTypeNotFoundException_IsSubclassOfDomainException()
    {
        var ex = new ProductTypeNotFoundException(1);

        ex.Should().BeAssignableTo<DomainException>();
    }

    // ── ProductTypeNombreDuplicadoException ───────────────────────────────────

    [Fact]
    public void ProductTypeNombreDuplicadoException_ContainsNombreInMessage()
    {
        var ex = new ProductTypeNombreDuplicadoException("Clasificados");

        ex.Message.Should().Contain("Clasificados");
    }

    [Fact]
    public void ProductTypeNombreDuplicadoException_ExposesNombre()
    {
        var ex = new ProductTypeNombreDuplicadoException("Notables");

        ex.Nombre.Should().Be("Notables");
    }

    [Fact]
    public void ProductTypeNombreDuplicadoException_IsSubclassOfDomainException()
    {
        var ex = new ProductTypeNombreDuplicadoException("x");

        ex.Should().BeAssignableTo<DomainException>();
    }

    // ── ProductTypeEnUsoException ─────────────────────────────────────────────

    [Fact]
    public void ProductTypeEnUsoException_ContainsCountInMessage()
    {
        var ex = new ProductTypeEnUsoException(id: 5, productsActivos: 7);

        ex.Message.Should().Contain("7");
    }

    [Fact]
    public void ProductTypeEnUsoException_ExposesProductTypeIdAndCount()
    {
        var ex = new ProductTypeEnUsoException(id: 10, productsActivos: 3);

        ex.ProductTypeId.Should().Be(10);
        ex.ProductsActivos.Should().Be(3);
    }

    [Fact]
    public void ProductTypeEnUsoException_IsSubclassOfDomainException()
    {
        var ex = new ProductTypeEnUsoException(1, 0);

        ex.Should().BeAssignableTo<DomainException>();
    }

    // ── ProductTypeFlagsIncoherentesException ─────────────────────────────────

    [Fact]
    public void ProductTypeFlagsIncoherentesException_ContainsReasonInMessage()
    {
        var ex = new ProductTypeFlagsIncoherentesException("IsBundle sin hijos definidos");

        ex.Message.Should().Contain("IsBundle sin hijos definidos");
    }

    [Fact]
    public void ProductTypeFlagsIncoherentesException_ExposesReason()
    {
        var ex = new ProductTypeFlagsIncoherentesException("razón técnica");

        ex.Reason.Should().Be("razón técnica");
    }

    [Fact]
    public void ProductTypeFlagsIncoherentesException_IsSubclassOfDomainException()
    {
        var ex = new ProductTypeFlagsIncoherentesException("x");

        ex.Should().BeAssignableTo<DomainException>();
    }
}
