using Application.Services.Database;
using FluentValidation;

namespace Application.Endpoints.MedicalHistories;

public class MedicalHistoryUpdateValidation : AbstractValidator<MedicalHistoryUpdateDTO>
{
    private readonly IMedicalHistoryRepository _medicalHistoryRepository;
    private readonly IPacientRepository _pacientRepository;

    public MedicalHistoryUpdateValidation(IMedicalHistoryRepository medicalHistoryRepository, IPacientRepository pacientRepository)
    {
        _medicalHistoryRepository = medicalHistoryRepository;
        _pacientRepository = pacientRepository;

        RuleFor(x => x.Id)
            .NotEmpty().WithMessage("Id is required")
            .MustAsync(BeExistingMedicalHistoryRecord).WithMessage("Medical hostory record does not exist");

        RuleFor(x => x.UserId)
            .NotEmpty().WithMessage("Pacient is required.")
            .MustAsync(BeExistingUser).WithMessage("Specified pacient id doesn't exist.");

        RuleFor(x => x.Description)
            .NotEmpty().WithMessage("Description is required.");
    }

    private async Task<bool> BeExistingMedicalHistoryRecord(Guid guid, CancellationToken token)
    {
        var record = await _medicalHistoryRepository.GetByIdAsync(guid);
        return record != null;
    }

    private async Task<bool> BeExistingUser(Guid userId, CancellationToken cancellationToken)
    {
        var pacient = await _pacientRepository.GetByIdAsync(userId);
        return pacient != null;
    }
}
