using SolutionErp.Application.Master.Suppliers.Dtos;

namespace SolutionErp.Application.Master.Suppliers.Import;

/// <summary>
/// Import NCC từ file Excel "Database NCC" (Supplier Phase B, Approach A — layout-locked).
/// Impl ở Infrastructure (ClosedXML). Inject IApplicationDbContext để testable.
/// </summary>
public interface ISupplierExcelImportService
{
    /// <summary>
    /// Parse + validate + classify từng hàng (KHÔNG ghi DB). Match Code case-insensitive
    /// (SQL Server unique-index CI) → existing = Update, mới = New, thiếu Code/Name = Error,
    /// hàng rỗng = Skip. Header sai layout → PreviewDto.LayoutValid=false.
    /// </summary>
    Task<SupplierImportPreviewDto> PreviewAsync(Stream xlsx, CancellationToken ct = default);

    /// <summary>
    /// ALL-OR-NOTHING: re-validate; nếu có hard-error (thiếu Name) → trả Errors, KHÔNG ghi gì.
    /// Ngược lại upsert (dedup MST-primary + Code-backstop; New → insert, blank Code = draft IsPublic=false;
    /// match → fill-nulls-only) rồi SaveChanges 1 lần. <paramref name="actor"/> chỉ dùng để log
    /// (audit thật do interceptor set).
    /// </summary>
    Task<SupplierImportResultDto> ConfirmAsync(IReadOnlyList<SupplierImportRowDto> rows, string actor, CancellationToken ct = default);

    /// <summary>
    /// Sinh file .xlsx mẫu trống đúng layout (30 token header vào ROW 4, freeze row 4) từ
    /// single-source ExpectedHeaderTokens → 0 drift với validator. Người dùng tải về, điền, upload lại.
    /// </summary>
    byte[] BuildTemplate();
}
