namespace PromotionService.API.Application.Services;

/// <summary>
/// EN: Interface for Wallet Service client (escrow operations).
/// VI: Interface cho Wallet Service client (thao tác ký quỹ).
/// </summary>
public interface IWalletServiceClient
{
    /// <summary>
    /// EN: Create an escrow hold in the wallet.
    /// VI: Tạo một lệnh giữ ký quỹ trong ví.
    /// </summary>
    Task<HoldResult> CreateHoldAsync(
        Guid walletId,
        decimal amount,
        string currencyType,
        string referenceType,
        Guid referenceId,
        string description,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Execute (commit) a portion of the held amount.
    /// VI: Thực thi (cam kết) một phần số tiền bị giữ.
    /// </summary>
    Task<bool> ExecuteHoldAsync(
        Guid walletId,
        Guid holdId,
        decimal amount,
        string? executionRef = null,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Release (return) a portion of the held amount.
    /// VI: Giải phóng (trả lại) một phần số tiền bị giữ.
    /// </summary>
    Task<bool> ReleaseHoldAsync(
        Guid walletId,
        Guid holdId,
        decimal? amount = null,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Cancel the entire hold.
    /// VI: Hủy toàn bộ lệnh giữ.
    /// </summary>
    Task<bool> CancelHoldAsync(
        Guid walletId,
        Guid holdId,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get wallet by user ID.
    /// VI: Lấy ví theo ID người dùng.
    /// </summary>
    Task<WalletInfo?> GetWalletByUserIdAsync(
        Guid userId,
        CancellationToken cancellationToken = default);
}

/// <summary>
/// EN: Result of escrow hold creation.
/// VI: Kết quả tạo lệnh giữ ký quỹ.
/// </summary>
public record HoldResult(
    Guid HoldId,
    Guid WalletId,
    decimal Amount,
    string CurrencyType,
    string ReferenceType,
    Guid ReferenceId,
    string Status);

/// <summary>
/// EN: Wallet information.
/// VI: Thông tin ví.
/// </summary>
public record WalletInfo(
    Guid Id,
    Guid UserId,
    string Status);
