using BookHive.DTO.Loan;
using FastEndpoints;
using FluentValidation;

namespace BookHive.Validators.Loans;

public class UpdateLoanDtoValidator : Validator<UpdateLoanDto>
{
    public UpdateLoanDtoValidator()
    {
        RuleFor(x => x.Id)
            .GreaterThan(0)
            .WithMessage("Id is invalid.");

        RuleFor(x => x.BookId)
            .GreaterThan(0)
            .WithMessage("Invalid book id.");

        RuleFor(x => x.MemberId)
            .GreaterThan(0)
            .WithMessage("Invalid member id.");

        RuleFor(x => x.LoanDate)
            .NotEmpty()
            .WithMessage("Date is required.");

        RuleFor(x => x.DueDate)
            .NotEmpty()
            .WithMessage("Due date is required.")
            .GreaterThan(d => d.LoanDate)
            .WithMessage("Due date must be in the future.")
            .Must((loan, dueDate) => dueDate <= loan.LoanDate.AddDays(30))
            .WithMessage("Due date must be in the future.");

        When(x => x.ReturnDate != null, () =>
        {
            RuleFor(x => x.ReturnDate)
                .GreaterThan(d => d.LoanDate)
                .WithMessage("Return date must be in the future.");
        });
    }
}