using Baya.Domain.Entities.Identity;
using Baya.Domain.Entities.User;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Baya.Infrastructure.Persistence.Configuration.IdentityConfig;

internal sealed class NurseProfileConfig : IEntityTypeConfiguration<NurseProfile>
{
    public void Configure(EntityTypeBuilder<NurseProfile> builder)
    {
        builder.ToTable("NurseProfiles", "usr");

        builder.Property(p => p.Bio).HasMaxLength(2000);
        builder.Property(p => p.EducationLevel).HasMaxLength(100);
        builder.Property(p => p.EducationField).HasMaxLength(150);
        builder.Property(p => p.AvatarUrl).HasMaxLength(2048);
        builder.Property(p => p.IsVerified).HasDefaultValue(false);
        builder.Property(p => p.IsAcceptingBookings).HasDefaultValue(false);

        // Read-only quality aggregates — default 0, recomputed by reviews/bookings phases.
        builder.Property(p => p.AverageRating).HasPrecision(3, 2).HasDefaultValue(0m);
        builder.Property(p => p.TotalReviews).HasDefaultValue(0);
        builder.Property(p => p.TotalCompletedBookings).HasDefaultValue(0);

        // 1:1 with the owning user.
        builder.HasIndex(p => p.UserId).IsUnique();
        builder.HasOne(p => p.User)
            .WithOne()
            .HasForeignKey<NurseProfile>(p => p.UserId)
            .IsRequired();

        builder.HasQueryFilter(p => p.DeletedAt == null);
    }
}
