import prisma from '../../../config/database';
import { IPaymentGateway } from '../interfaces/payment-gateway.interface';
import { RazorpayGateway } from '../gateways/razorpay.gateway';
import { PhonePeGateway } from '../gateways/phonepe.gateway';
import { PayUGateway } from '../gateways/payu.gateway';
import { StripeGateway } from '../gateways/stripe.gateway';
import { PayPalGateway } from '../gateways/paypal.gateway';
import { DynamicUpiGateway } from '../gateways/upi.gateway';
import { decrypt } from '../../../utils/encryption.utils';

export class PaymentGatewayFactory {
  static async getGateway(gatewayName: string): Promise<IPaymentGateway> {
    const name = gatewayName.toUpperCase();

    // Query configuration dynamically from Database
    const setting = await prisma.paymentGatewaySetting.findUnique({
      where: { gatewayName: name },
    });

    // Decrypt credentials if database settings exist
    const config = setting
      ? {
          keyId: setting.keyId || undefined,
          keySecret: setting.keySecret ? decrypt(setting.keySecret) : undefined,
          clientId: setting.clientId || undefined,
          clientSecret: setting.clientSecret ? decrypt(setting.clientSecret) : undefined,
          merchantId: setting.merchantId || undefined,
          saltKey: setting.saltKey ? decrypt(setting.saltKey) : undefined,
          saltIndex: setting.saltIndex || undefined,
          webhookSecret: setting.webhookSecret ? decrypt(setting.webhookSecret) : undefined,
        }
      : {};

    switch (name) {
      case 'RAZORPAY':
        return new RazorpayGateway(config);
      case 'PHONEPE':
        return new PhonePeGateway(config);
      case 'PAYU':
        return new PayUGateway(config);
      case 'STRIPE':
        return new StripeGateway(config);
      case 'PAYPAL':
        return new PayPalGateway(config);
      case 'UPI':
        return new DynamicUpiGateway(config);
      default:
        throw new Error(`Unsupported payment gateway: ${gatewayName}`);
    }
  }
}
