using SolutionErp.Domain.Master;

namespace SolutionErp.Application.Master.Suppliers.Dtos;

// ============================================================================
// Supplier Phase B — Upload Excel "Database NCC" (Approach A, layout-locked).
// DTOs shared giữa preview + confirm. Records có property SETTABLE vì hàng import
// được parse → classify → round-trip FE → confirm (mutable trong toàn pipeline).
// ============================================================================

/// <summary>Phân loại mỗi hàng sau khi preview classify.</summary>
public enum RowImportStatus
{
    New = 0,      // MST + Code đều chưa match trong DB → sẽ INSERT (blank Code = draft ẩn)
    Update = 1,   // match theo MST (ưu tiên) hoặc Code → sẽ FILL-NULLS (không đè non-null)
    Skip = 2,     // hàng rỗng hoàn toàn → bỏ qua
    Error = 3,    // thiếu Name → không import được (v2: blank Code KHÔNG còn là lỗi, = draft hợp lệ)
}

/// <summary>
/// 1 hàng Excel đã parse + map sang field Supplier (27) + provenance (2) + chẩn đoán.
/// <c>Status</c> = phân loại hàng (RowImportStatus). <c>SupplierStatus</c> = tình trạng NCC (cột 27).
/// </summary>
public sealed record SupplierImportRowDto
{
    public int RowIndex { get; set; }                     // số dòng thật trên Excel (1-based)

    // ---- 27 field map sang Supplier (thứ tự theo cột Excel) ----
    public string? PackageCategory { get; set; }          // col 2
    public SupplierType Type { get; set; } = SupplierType.NhaCungCap; // col 3 (unknown → NhaCungCap, decision 5)
    public string? Code { get; set; }                     // col 4 "TÊN VIẾT TẮT" (upsert key, Trim)
    public string? Name { get; set; }                     // col 5
    public string? Address { get; set; }                  // col 6
    public string? OfficeAddress { get; set; }            // col 7
    public string? Phone { get; set; }                    // col 8
    public string? Fax { get; set; }                      // col 9
    public string? BankAccount { get; set; }              // col 10 (raw composite)
    public string? SecondaryBankAccount { get; set; }     // col 11
    public string? TaxCode { get; set; }                  // col 12 (raw, nullable)
    public string? LegalRepresentative { get; set; }      // col 13
    public string? LegalRepTitle { get; set; }            // col 14
    public string? AuthorizationNote { get; set; }        // col 15
    public string? LinkGuq { get; set; }                  // col 16 (raw NAS backslash)
    public string? LinkGpkd { get; set; }                 // col 17
    public string? LinkHsnl { get; set; }                 // col 18
    public string? ContactPerson { get; set; }            // col 19
    public string? ContactTitle { get; set; }             // col 20
    public string? ContactPhone { get; set; }             // col 21
    public string? Email { get; set; }                    // col 22
    public string? MailingAddress { get; set; }           // col 23
    public string? MailRecipient { get; set; }            // col 24 (raw composite)
    public string? ReferralSource { get; set; }           // col 25
    public string? OwnerPmh { get; set; }                 // col 26
    public SupplierStatus? SupplierStatus { get; set; }   // col 27 (unknown → null)
    public string? Note { get; set; }                     // col 28

    // ---- 2 import-provenance ----
    public DateTime? SourceUpdatedAt { get; set; }        // col 29 (null nếu không parse được ngày)
    public string? SourceUpdatedBy { get; set; }          // col 30

    // ---- classify + diagnostics ----
    public RowImportStatus Status { get; set; }
    public List<string> Messages { get; set; } = new();   // cảnh báo truncate / default type / lý do lỗi
    public Guid? ExistingSupplierId { get; set; }         // set khi Status=Update (hỗ trợ FE hiển thị "sẽ cập nhật")
    public bool MstMissing { get; set; }                  // true khi cột 12 (MST) rỗng — cảnh báo mềm (không chặn), FE render ⚠️
}

/// <summary>Kết quả preview (KHÔNG ghi DB). LayoutValid=false khi header-fingerprint không khớp.</summary>
public sealed record SupplierImportPreviewDto
{
    public List<SupplierImportRowDto> Rows { get; set; } = new();
    public int NewCount { get; set; }
    public int UpdateCount { get; set; }
    public int SkipCount { get; set; }
    public int ErrorCount { get; set; }
    public List<string> Warnings { get; set; } = new();
    public bool LayoutValid { get; set; } = true;         // false → file bị từ chối (sai layout), Rows rỗng
}

/// <summary>Kết quả confirm. Committed=false + Errors khi có hard-error (all-or-nothing, không ghi gì).</summary>
public sealed record SupplierImportResultDto
{
    public int Inserted { get; set; }
    public int Updated { get; set; }
    public int Skipped { get; set; }
    public int DraftCount { get; set; }                   // số NCC MỚI lưu nháp (blank Code → IsPublic=false) trong lần import này
    public List<string> Errors { get; set; } = new();
    public bool Committed { get; set; }                   // true nếu đã SaveChanges; false nếu abort do hard-error
}
