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.
    Task TransitionAsync(
        Contract contract,
        ContractPhase targetPhase,
        Guid? actorUserId,
        IReadOnlyList<string> actorRoles,
        ApprovalDecision decision,
        string? comment,
        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);
}
