import { db } from "@/lib/db";
import { AsaasProvider } from "./asaas";
import type { BillingType, RecurringBillingProvider } from "./types";

export async function provisionRecurringBilling(tenantId: string, planCode: string, billingType: BillingType, provider: RecurringBillingProvider = new AsaasProvider()) {
  const subscription = await db.subscription.findUnique({ where: { tenantId }, include: { tenant: true } });
  const plan = await db.plan.findFirst({ where: { code: planCode, active: true } });
  if (!subscription || !plan) throw new Error("Assinatura ou plano não encontrado");
  if (subscription.externalSubscriptionId) throw new Error("Assinatura recorrente já provisionada");

  let customerId = subscription.externalCustomerId;
  if (!customerId) {
    const customer = await provider.createCustomer({ tenantId, name: subscription.tenant.name, document: subscription.tenant.legalDocument, email: subscription.tenant.email, phone: subscription.tenant.phone });
    customerId = customer.id;
    await db.subscription.update({ where: { id: subscription.id }, data: { externalCustomerId: customerId } });
  }
  const nextDueDate = subscription.trialEndsAt && subscription.trialEndsAt > new Date() ? subscription.trialEndsAt : new Date();
  const remote = await provider.createSubscription({ localSubscriptionId: subscription.id, customerId, billingType, valueCents: plan.priceCents, nextDueDate, description: `Shop Compras - Plano ${plan.name}` });
  return db.subscription.update({ where: { id: subscription.id }, data: { planId: plan.id, priceCents: plan.priceCents, provider: "ASAAS", externalSubscriptionId: remote.id, billingType, status: "TRIAL" } });
}
