using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using MktZaloService.Domain.AggregatesModel.TemplateAggregate;
using MktZaloService.Domain.Enums;

namespace MktZaloService.Infrastructure.EntityConfigurations;

/// <summary>
/// EN: EF Core configuration for MessageTemplate aggregate.
/// VI: Cấu hình EF Core cho MessageTemplate aggregate.
/// </summary>
public class MessageTemplateEntityTypeConfiguration : IEntityTypeConfiguration<MessageTemplate>
{
    public void Configure(EntityTypeBuilder<MessageTemplate> builder)
    {
        builder.ToTable("MessageTemplates");

        // EN: Primary key / VI: Khóa chính
        builder.HasKey(t => t.Id);

        // EN: Indexes / VI: Chỉ mục
        builder.HasIndex(t => t.ZaloTemplateId)
            .IsUnique()
            .HasDatabaseName("IX_MessageTemplates_ZaloTemplateId");

        builder.HasIndex(t => t.Status)
            .HasDatabaseName("IX_MessageTemplates_Status");

        // EN: Properties / VI: Thuộc tính
        builder.Property(t => t.ZaloTemplateId)
            .IsRequired()
            .HasMaxLength(50);

        builder.Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(255);

        builder.Property(t => t.Content)
            .IsRequired();

        // EN: Store enum as string for easier debugging
        // VI: Lưu enum dạng string để dễ debug
        builder.Property(t => t.Status)
            .HasConversion<string>()
            .HasMaxLength(20);

        builder.Property(t => t.SendCount)
            .HasDefaultValue(0);

        // EN: Audit fields / VI: Trường audit
        builder.Property(t => t.CreatedAt)
            .IsRequired();

        builder.Property(t => t.UpdatedAt)
            .IsRequired();

        // EN: Parameters relationship / VI: Quan hệ Parameters
        builder.HasMany(t => t.Parameters)
            .WithOne(p => p.Template)
            .HasForeignKey(p => p.TemplateId)
            .OnDelete(DeleteBehavior.Cascade);

        // EN: Ignore domain events for EF / VI: Bỏ qua domain events cho EF
        builder.Ignore(t => t.DomainEvents);
    }
}

/// <summary>
/// EN: EF Core configuration for TemplateParameter entity.
/// VI: Cấu hình EF Core cho TemplateParameter entity.
/// </summary>
public class TemplateParameterEntityTypeConfiguration : IEntityTypeConfiguration<TemplateParameter>
{
    public void Configure(EntityTypeBuilder<TemplateParameter> builder)
    {
        builder.ToTable("TemplateParameters");

        builder.HasKey(p => p.Id);

        // EN: Index / VI: Chỉ mục
        builder.HasIndex(p => new { p.TemplateId, p.Name })
            .IsUnique()
            .HasDatabaseName("IX_TemplateParameters_TemplateId_Name");

        // EN: Properties / VI: Thuộc tính
        builder.Property(p => p.Name)
            .IsRequired()
            .HasMaxLength(100);

        builder.Property(p => p.DefaultValue)
            .HasMaxLength(500);

        builder.Property(p => p.IsRequired)
            .HasDefaultValue(true);

        // EN: Ignore domain events for EF / VI: Bỏ qua domain events cho EF
        builder.Ignore(p => p.DomainEvents);
    }
}
