import { Injectable } from "@nestjs/common";
import { Provider } from "@prisma/client";
import { PrismaService } from "../prisma/prisma.service";
import {
  ProviderCatalogEntryDto,
  ProviderPaymentMethodDto,
} from "./dto/provider-catalog.dto";

const CATALOG: ProviderCatalogEntryDto[] = [
  {
    id: Provider.dlocal,
    displayName: "dLocal Go",
    countries: ["PY"],
    paymentMethods: ["card", "transfer"],
    modes: ["sandbox", "live"],
    available: true,
    docsUrl: "https://docs.dlocalgo.com/integration-api",
    // dLocal Go exige un mínimo de Gs. 10.000 por cobro.
    minAmount: { PYG: 10000 },
    // dLocal opera con checkout hospedado: elige medio y pide datos del comprador
    // en su propia página. No expone cobro directo por API.
    requiresPlatformId: false,
    requiredCustomerFields: [],
    supportsDirect: false,
    supportsHosted: true,
    supportsNativeLink: false,
    features: ["refund"],
  },
  {
    id: Provider.dpago,
    displayName: "Dpago",
    countries: ["PY"],
    paymentMethods: ["card", "wallet", "pix", "zimple", "qr"],
    modes: ["sandbox", "live"],
    available: true,
    docsUrl: "https://api.dpago.com",
    // Dpago acepta montos desde Gs. 1.000.
    minAmount: { PYG: 1000 },
    // Cobro directo (`/transactions`) exige medio de pago y comprador completo.
    // También soporta link de pago (`/links`) para compartir.
    requiresPlatformId: true,
    requiredCustomerFields: ["email", "name", "docNumber", "phone"],
    supportsDirect: true,
    supportsHosted: true,
    supportsNativeLink: true,
    features: ["qr"],
  },
  {
    id: Provider.bancard,
    displayName: "Bancard vPOS",
    countries: ["PY"],
    paymentMethods: ["card"],
    modes: ["sandbox", "live"],
    available: false,
    docsUrl: "https://vpos.infonet.com.py:8888/vpos/docs",
  },
  {
    id: Provider.pagopar,
    displayName: "Pagopar",
    countries: ["PY"],
    paymentMethods: ["card", "transfer", "cash"],
    modes: ["sandbox", "live"],
    available: false,
    docsUrl: "https://developers.pagopar.com",
  },
  {
    id: Provider.dinelco,
    displayName: "Dinelco",
    countries: ["PY"],
    paymentMethods: ["card"],
    modes: ["sandbox", "live"],
    available: false,
    docsUrl: null,
  },
];

@Injectable()
export class ProviderCatalogService {
  constructor(private readonly prisma: PrismaService) {}

  list(): ProviderCatalogEntryDto[] {
    return CATALOG;
  }

  /**
   * Lista los medios de pago (platformIds) de un provider para un país. Catálogo
   * global no sensible — lo consume el ERP para poblar el selector de "QR directo"
   * en Nuevo Cobro y, más adelante, la app móvil de cobradores.
   */
  async listPaymentMethods(
    provider: Provider,
    country = "PY",
  ): Promise<ProviderPaymentMethodDto[]> {
    const methods = await this.prisma.providerPaymentMethod.findMany({
      where: { provider, country, active: true },
      orderBy: { name: "asc" },
      select: { externalId: true, name: true, method: true },
    });
    return methods.map((m) => ({
      platformId: m.externalId,
      name: m.name,
      method: m.method,
    }));
  }
}
