using SolutionErp.Domain.Contracts;

namespace SolutionErp.Application.Contracts.Services;

public interface IContractWorkflowService
{
    // Kiểm tra + thực hiện transition. Throw ForbiddenException nếu không hợp lệ.
    // Tự tạo ContractApproval row + update Phase + SlaDeadline + gen mã HĐ nếu cần.
    // [Plan B S29 2026-05-22] +skipToFinal param F2 (Mig 31): Approver scope
    // ChoDuyet skip thẳng Cấp cuối. V2 only, V1 legacy throw nếu non-admin.
    // Default false để KHÔNG break existing caller (ContractsController).
    Task TransitionAsync(
        Contract contract,
        ContractPhase targetPhase,
        Guid? actorUserId,
        IReadOnlyList<string> actorRoles,
        ApprovalDecision decision,
        string? comment,
        bool skipToFinal = false,
        // [WQ3-BE S190 · YC-030 Q3] OPT-OUT của "KẾT THÚC TẠI CẤP" (level-finalize), khuôn KHKK
        // `IContractSigningPlanWorkflowService` / PE S96: mặc định TRUE = Cấp có
        // `AllowApproverFinalize` bấm Duyệt là HĐ phát hành luôn; client gửi false = người duyệt
        // BỎ tick ⇒ trình tiếp Bước/Cấp sau. Default true để KHÔNG break caller cũ (mọi call-site
        // hiện tại truyền `ct:` theo TÊN nên chèn tham số ở đây an toàn).
        bool applyLevelFinalize = true,
        CancellationToken ct = default);

    // SLA còn bao lâu ở phase hiện tại (seconds). Null nếu không có SLA.
    TimeSpan? GetPhaseSla(ContractPhase phase);
}

public interface IContractCodeGenerator
{
    // Gen mã HĐ theo RG-001 format. Transaction SERIALIZABLE để tránh race.
    Task<string> GenerateAsync(Contract contract, string projectCode, string supplierCode, CancellationToken ct = default);
}
