// lib/features/booking/services/payment_service.dart

import 'package:razorpay_flutter/razorpay_flutter.dart';
import 'package:flutter/foundation.dart';

typedef PaymentSuccessCallback = void Function(PaymentSuccessResponse response);
typedef PaymentErrorCallback = void Function(PaymentFailureResponse response);
typedef ExternalWalletCallback = void Function(ExternalWalletResponse response);

class PaymentService {
  late Razorpay _razorpay;

  // Razorpay test key — matches web app
  static const String _testKey = 'rzp_test_S49PVZmqAVoWSH';

  PaymentSuccessCallback? onSuccess;
  PaymentErrorCallback? onError;
  ExternalWalletCallback? onExternalWallet;

  void initialize({
    required PaymentSuccessCallback onSuccess,
    required PaymentErrorCallback onError,
    ExternalWalletCallback? onExternalWallet,
  }) {
    _razorpay = Razorpay();
    this.onSuccess = onSuccess;
    this.onError = onError;
    this.onExternalWallet = onExternalWallet;

    _razorpay.on(Razorpay.EVENT_PAYMENT_SUCCESS, _handleSuccess);
    _razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, _handleError);
    _razorpay.on(Razorpay.EVENT_EXTERNAL_WALLET, _handleExternalWallet);
  }

  void openPayment({
    required double amount,
    required String email,
    required String phone,
    required String eventName,
    String? orderId,
  }) {
    final options = <String, dynamic>{
      'key': _testKey,
      'amount': (amount * 100).toInt(), // paise
      'currency': 'INR',
      'name': 'Eventify',
      'description': 'Ticket: $eventName',
      'prefill': {
        'email': email,
        'contact': phone,
      },
      'theme': {'color': '#0B63D6'},
    };
    if (orderId != null) options['order_id'] = orderId;

    if (kDebugMode) debugPrint('PaymentService: opening Razorpay with amount=${amount * 100} paise');
    _razorpay.open(options);
  }

  void _handleSuccess(PaymentSuccessResponse res) => onSuccess?.call(res);
  void _handleError(PaymentFailureResponse res) => onError?.call(res);
  void _handleExternalWallet(ExternalWalletResponse res) => onExternalWallet?.call(res);

  void dispose() {
    _razorpay.clear();
  }
}
