/// نتیجه‌ی یک خریدِ فروشگاهی، مستقل از اینکه کدام SDK آن را تولید کرده.
///
/// بک‌اند برای تأییدِ آفلاینِ RSA به [purchaseData] (JSONِ خام) و [signature]
/// نیاز دارد؛ [token] هم برای تأییدِ سمت‌سرور/سازگاری فرستاده می‌شود.
class PurchaseResult {
  final bool success;
  final String token;
  final String purchaseData;
  final String signature;

  /// پاک‌سازیِ لازم پس از تأییدِ بک‌اند (مثلاً مایکت باید خرید را consume کند).
  final Future<void> Function()? onConfirmed;

  const PurchaseResult.success({
    required this.token,
    required this.purchaseData,
    required this.signature,
    this.onConfirmed,
  }) : success = true;

  const PurchaseResult.failure()
      : success = false,
        token = '',
        purchaseData = '',
        signature = '',
        onConfirmed = null;
}

/// انتزاعِ SDKِ پرداختِ درون‌برنامه‌ایِ مخصوصِ هر فروشگاه. هر flavor یک پیاده‌سازی
/// ثبت می‌کند؛ بقیه‌ی اپ از SDK بی‌خبر می‌ماند.
abstract class PaymentGateway {
  /// شناسه‌ی فروشگاه که به بک‌اند فرستاده می‌شود (`myket` | `bazaar`).
  String get store;

  /// جریانِ خریدِ [productSku] (همان UUIDِ محصول در پنلِ فروشگاه) را باز می‌کند.
  /// [payload] در فروشگاه ذخیره و در پنلِ توسعه‌دهنده نمایش داده می‌شود؛ اینجا
  /// شماره‌ی موبایلِ کاربر را می‌فرستیم تا خرید قابلِ ردیابی باشد.
  Future<PurchaseResult> purchase(String productSku, {String payload = ''});

  /// اتصالِ اولیه (در صورتِ نیاز). پیش از اولین خرید صدا زده می‌شود.
  Future<void> connect() async {}
}
