using SolutionErp.Domain.Contracts;
using SolutionErp.Domain.PurchaseEvaluations;

namespace SolutionErp.Application.PurchaseEvaluations.Services;

public interface IPurchaseEvaluationWorkflowService
{
    // Kiểm tra + thực hiện transition. Throw ForbiddenException nếu không hợp lệ.
    // Tự tạo PurchaseEvaluationApproval + update Phase + SlaDeadline.
    //
    // Optional params Mig 28-31 (S21-S23 advanced workflow options per-NV slot):
    // - returnMode: mode Trả lại (F1). Null = default Drafter behavior khi Reject+TraLai.
    //   OneLevel/OneStep/Assignee → giữ Phase=ChoDuyet, lùi pointer (peer review).
    //   Drafter → Phase=TraLai clear pointer như S17. Flag check tại level.Allow*.
    // - returnTargetUserId: required khi returnMode=Assignee — pick từ list NV đã duyệt.
    // - skipToFinal: F2 Approver during ChoDuyet duyệt thẳng Cấp cuối → set Phase=DaDuyet
    //   terminal trực tiếp, clear pointer. Mig 31 (S23 t1) refactor sang Approver scope:
    //   matchingLevel.AllowApproverSkipToFinal phải true (admin opt-in per slot).
    //   Semantic cũ Drafter-from-Nháp đã deprecated + storage cũ trên Users table đã drop.
    Task TransitionAsync(
        PurchaseEvaluation evaluation,
        PurchaseEvaluationPhase targetPhase,
        Guid? actorUserId,
        IReadOnlyList<string> actorRoles,
        ApprovalDecision decision,
        string? comment,
        WorkflowReturnMode? returnMode = null,
        Guid? returnTargetUserId = null,
        bool skipToFinal = false,
        // [Mig 54 2026-06-18 — anh Kiệt FDC] ③ CCM tích "Duyệt done miễn CEO" +
        // ① giá CHỐT người duyệt cuối chọn (amount + source ∈ Ncc/ProMin/ProMax/Ccm).
        bool finalizeByCcmDelegation = false,
        decimal? approvedPriceAmount = null,
        string? approvedPriceSource = null,
        // [S117 2026-07-14 — anh Kiệt FDC] Max của khoảng khi source="ProMinMax" (duyệt theo Min–Max).
        // null = giá đơn (giữ nguyên Mig 54); != null ⟺ source=="ProMinMax", Amount=Min.
        decimal? approvedPriceMaxAmount = null,
        // [S96 2026-07-01 — anh Kiệt FDC] Người duyệt BỎ tick "Cấp này KẾT THÚC quy trình"
        // (AllowApproverFinalize) → false = KHÔNG finalize, vẫn trình tiếp CEO/cấp sau.
        // Default true = giữ hành vi cũ (cấp cấu hình finalize → auto kết thúc). Đảo S89 auto→opt-out.
        bool applyLevelFinalize = true,
        CancellationToken ct = default);

    TimeSpan? GetPhaseSla(PurchaseEvaluationPhase phase);
}

/// Mig 28 (S21 t4) — F1 mode Trả lại. Mapping với ApprovalWorkflow.Allow* flag.
public enum WorkflowReturnMode
{
    OneLevel = 1,        // Lùi 1 Cấp trong cùng Step (peer review)
    OneStep = 2,         // Lùi sang Bước trước, level = max của bước đó
    Assignee = 3,        // Pick runtime từ list NV đã duyệt
    Drafter = 4,         // Trả về Drafter, Phase=TraLai clear pointer (S17 default fallback)
}

// Atomic sequence generator cho mã PE (MaPhieu) — mirror IContractCodeGenerator.
// Format: PE/{YYYY}/{TypeLetter}/{Seq:D3}
//   - YYYY = năm hiện tại (UTC)
//   - TypeLetter = "A" (DuyetNcc) / "B" (DuyetNccPhuongAn)
//   - Seq = 3 chữ số tăng dần per (year × type)
// VD: PE/2026/A/001, PE/2026/A/002, PE/2026/B/001
public interface IPurchaseEvaluationCodeGenerator
{
    // Gen mã phiếu atomic. Transaction SERIALIZABLE để tránh race condition.
    Task<string> GenerateAsync(PurchaseEvaluation evaluation, CancellationToken ct = default);
}
