import prisma from '../../../config/database';
import { IShippingProvider } from '../interfaces/shipping-provider.interface';
import { ShiprocketProvider } from '../providers/shiprocket.provider';
import { ManualShippingProvider } from '../providers/manual.provider';
import { decrypt } from '../../../utils/encryption.utils';

export class ShippingProviderFactory {
  static async getProvider(providerName: string): Promise<IShippingProvider> {
    const name = providerName.toUpperCase();

    // Query credentials configuration from database
    const setting = await prisma.shippingProvider.findUnique({
      where: { providerName: name },
    });

    const config = setting
      ? {
          apiEmail: setting.apiEmail || undefined,
          apiPassword: setting.apiPassword ? decrypt(setting.apiPassword) : undefined,
          apiToken: setting.apiToken ? decrypt(setting.apiToken) : undefined,
          clientId: setting.clientId || undefined,
          clientSecret: setting.clientSecret ? decrypt(setting.clientSecret) : undefined,
          apiKey: setting.apiKey || undefined,
          secretKey: setting.secretKey ? decrypt(setting.secretKey) : undefined,
          environment: setting.environment || 'sandbox',
          warehouseName: setting.warehouseName || undefined,
          pickupLocation: setting.pickupLocation || undefined,
        }
      : {};

    switch (name) {
      case 'SHIPROCKET':
        return new ShiprocketProvider(config);
      case 'MANUAL':
        return new ManualShippingProvider(config);
      default:
        // Support future channels automatically by defaulting to Manual
        return new ManualShippingProvider(config);
    }
  }
}
