using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using SolutionErp.Domain.ApprovalWorkflowsV2;

namespace SolutionErp.Infrastructure.Persistence.Configurations;

// EF config Mig 22 — schema mới riêng cho Quy trình duyệt v2 (UAT before drop legacy).

public class ApprovalWorkflowConfiguration : IEntityTypeConfiguration<ApprovalWorkflow>
{
    public void Configure(EntityTypeBuilder<ApprovalWorkflow> e)
    {
        e.ToTable("ApprovalWorkflows");
        e.Property(x => x.Code).HasMaxLength(100).IsRequired();
        e.Property(x => x.Name).HasMaxLength(200).IsRequired();
        e.Property(x => x.Description).HasMaxLength(1000);
        e.Property(x => x.ApplicableType).HasConversion<int>();

        // [S69 2026-06-17] Ngưỡng giá trị "gói CEO" — decimal(18,2), nullable
        // (null = không áp ngưỡng, giữ luồng tuyến tính cũ).
        e.Property(x => x.CeoApprovalThreshold).HasPrecision(18, 2);

        e.HasIndex(x => new { x.Code, x.Version }).IsUnique();
        e.HasIndex(x => new { x.ApplicableType, x.IsActive });

        // Mig 28 cũ 6 column Allow* đã DROP trong Mig 29 (S21 t5) — refactor sang
        // per-NV (Level table cho F1+F3, Users table cho F2). Backfill bulk SQL
        // preserve config admin từ S21 t4 trước khi drop.
        // + Mig 31 (S23 t1) F2 refactor sang Approver scope per-Level slot —
        // AllowApproverSkipToFinal trên Level table (admin opt-in per slot,
        // KHÔNG còn per-Drafter user scope cũ Mig 29).
    }
}

public class ApprovalWorkflowStepConfiguration : IEntityTypeConfiguration<ApprovalWorkflowStep>
{
    public void Configure(EntityTypeBuilder<ApprovalWorkflowStep> e)
    {
        e.ToTable("ApprovalWorkflowSteps");
        e.Property(x => x.Name).HasMaxLength(200).IsRequired();

        e.HasOne(x => x.ApprovalWorkflow)
            .WithMany(d => d.Steps)
            .HasForeignKey(x => x.ApprovalWorkflowId)
            .OnDelete(DeleteBehavior.Cascade);

        // Department FK Restrict (optional hint).
        e.HasOne<SolutionErp.Domain.Master.Department>()
            .WithMany()
            .HasForeignKey(x => x.DepartmentId)
            .OnDelete(DeleteBehavior.Restrict);

        e.HasIndex(x => new { x.ApprovalWorkflowId, x.Order });
        e.HasIndex(x => x.DepartmentId);
    }
}

public class ApprovalWorkflowLevelConfiguration : IEntityTypeConfiguration<ApprovalWorkflowLevel>
{
    public void Configure(EntityTypeBuilder<ApprovalWorkflowLevel> e)
    {
        e.ToTable("ApprovalWorkflowLevels");
        e.Property(x => x.Name).HasMaxLength(200);

        e.HasOne(x => x.Step)
            .WithMany(s => s.Levels)
            .HasForeignKey(x => x.ApprovalWorkflowStepId)
            .OnDelete(DeleteBehavior.Cascade);

        // ApproverUserId FK Restrict — không cấu hình nav để giữ nhẹ
        // (1 chiều, query qua join nếu cần admin xem detail).
        e.HasOne<SolutionErp.Domain.Identity.User>()
            .WithMany()
            .HasForeignKey(x => x.ApproverUserId)
            .OnDelete(DeleteBehavior.Restrict);

        e.HasIndex(x => new { x.ApprovalWorkflowStepId, x.Order });
        e.HasIndex(x => x.ApproverUserId);

        // Mig 29 (S21 t5) — 5 per-NV advanced options. 4 default false (admin
        // opt-in). 1 AllowReturnToDrafter default true (backward compat S17).
        e.Property(x => x.AllowReturnOneLevel).HasDefaultValue(false);
        e.Property(x => x.AllowReturnOneStep).HasDefaultValue(false);
        e.Property(x => x.AllowReturnToAssignee).HasDefaultValue(false);
        e.Property(x => x.AllowReturnToDrafter).HasDefaultValue(true);
        e.Property(x => x.AllowApproverEditDetails).HasDefaultValue(false);

        // Mig 30 (S22+5) — F4 per-NV: cho phép edit Section "Điều chỉnh ngân sách"
        // lúc đang duyệt. Default false (admin opt-in).
        e.Property(x => x.AllowApproverEditBudget).HasDefaultValue(false);

        // Mig 31 (S23 t1 Plan K Chunk A) — F2 per-NV REFACTOR: cho phép Approver
        // slot này skip thẳng Cấp cuối lúc đang duyệt ChoDuyet. Default false
        // (admin opt-in). Semantic + storage cũ ở Users table per-Drafter đã drop.
        e.Property(x => x.AllowApproverSkipToFinal).HasDefaultValue(false);

        // Mig 58 (2026-06-24 — CCM/anh Kiệt FDC) — F5 per-NV: cho phép NV slot này
        // duyệt = KẾT THÚC quy trình (Phase=DaDuyet) miễn trình CEO. Default false
        // (admin opt-in). Khác F2 (skip = advance tới Cấp cuối): F5 = terminal ngay.
        e.Property(x => x.AllowApproverFinalize).HasDefaultValue(false);

        // Mig 68 (S155 2026-07-27 — UAT Tra Sol) — F6 per-NV: cho phép NV slot này
        // xóa MỀM phiếu đang treo ở ChoDuyet khi tới lượt mình duyệt (phiếu bấm sai
        // gói thầu đang ăn lũy kế). Default false (admin opt-in per slot). Đọc
        // per-ROW chứ KHÔNG per-Cấp — 1 Cấp có N người (OR-of-N).
        e.Property(x => x.AllowApproverDelete).HasDefaultValue(false);
    }
}
