// EN: FluentValidation validator for CreateTherapistCommand.
// VI: FluentValidation validator cho CreateTherapistCommand.

using BookingService.API.Application.Commands.Therapist;
using FluentValidation;

namespace BookingService.API.Application.Validations;

/// <summary>
/// EN: Validator for CreateTherapistCommand ensuring all required fields are valid.
/// VI: Validator cho CreateTherapistCommand đảm bảo tất cả trường bắt buộc hợp lệ.
/// </summary>
public class CreateTherapistCommandValidator : AbstractValidator<CreateTherapistCommand>
{
    public CreateTherapistCommandValidator()
    {
        RuleFor(x => x.ShopId)
            .NotEmpty()
            .WithMessage("Shop ID is required / Shop ID là bắt buộc");

        RuleFor(x => x.Name)
            .NotEmpty()
            .WithMessage("Therapist name is required / Tên chuyên viên là bắt buộc")
            .MaximumLength(200)
            .WithMessage("Name cannot exceed 200 characters / Tên không được vượt quá 200 ký tự");

        RuleFor(x => x.WorkingHours)
            .NotNull()
            .WithMessage("Working hours are required / Giờ làm việc là bắt buộc");

        RuleFor(x => x.WorkingHours.Days)
            .NotEmpty()
            .When(x => x.WorkingHours != null)
            .WithMessage("At least one working day must be specified / Phải chỉ định ít nhất một ngày làm việc");

        RuleForEach(x => x.WorkingHours.Days)
            .ChildRules(day =>
            {
                day.RuleFor(d => d.DayOfWeek)
                    .InclusiveBetween(0, 6)
                    .WithMessage("Day of week must be between 0 (Sunday) and 6 (Saturday) / Ngày trong tuần phải từ 0 (Chủ nhật) đến 6 (Thứ bảy)");

                day.RuleFor(d => d.StartTime)
                    .NotEmpty()
                    .When(d => d.IsWorking)
                    .WithMessage("Start time is required for working days / Thời gian bắt đầu là bắt buộc cho ngày làm việc");

                day.RuleFor(d => d.EndTime)
                    .NotEmpty()
                    .When(d => d.IsWorking)
                    .WithMessage("End time is required for working days / Thời gian kết thúc là bắt buộc cho ngày làm việc");
            })
            .When(x => x.WorkingHours?.Days != null);
    }
}
