import { initDb } from "@/lib/db";
import { PLAN_DEFINITIONS } from "@/config/plans";
import type { PlanTier } from "@/types";

export interface BillingInvoiceRow {
  id: string;
  amountCents: number;
  currency: string;
  status: string;
  issuedAt: Date;
}

export interface BillingPageData {
  workspaceId: string;
  planTier: PlanTier;
  billingCycle: string;
  subscriptionStatus: string;
  responseQuotaUsed: number;
  responseQuotaLimit: number;
  stripeCustomerId: string | null;
  hasStripeSubscription: boolean;
  invoices: BillingInvoiceRow[];
}

/** Billing context for the client workspace. */
export async function getBillingPageData(
  workspaceId: string
): Promise<BillingPageData | null> {
  const { Workspace, Invoice } = initDb();

  const workspace = await Workspace.findByPk(workspaceId);
  if (!workspace) return null;

  const invoices = await Invoice.findAll({
    where: { workspaceId },
    order: [["issuedAt", "DESC"]],
    limit: 12,
  });

  return {
    workspaceId: workspace.id,
    planTier: workspace.planTier,
    billingCycle: workspace.billingCycle,
    subscriptionStatus: workspace.subscriptionStatus,
    responseQuotaUsed: workspace.responseQuotaUsed,
    responseQuotaLimit: workspace.responseQuotaLimit,
    stripeCustomerId: workspace.stripeCustomerId,
    hasStripeSubscription: Boolean(workspace.stripeSubscriptionId),
    invoices: invoices.map((inv) => ({
      id: inv.id,
      amountCents: inv.amount,
      currency: inv.currency,
      status: inv.status,
      issuedAt: inv.issuedAt,
    })),
  };
}

/** Apply plan tier limits after upgrade/downgrade. */
export async function applyPlanToWorkspace(
  workspaceId: string,
  planTier: PlanTier,
  billingCycle: "monthly" | "annual" = "monthly"
) {
  const { Workspace } = initDb();
  const limits = PLAN_DEFINITIONS[planTier].responseQuotaLimit;

  await Workspace.update(
    {
      planTier,
      billingCycle,
      responseQuotaLimit: limits,
      subscriptionStatus: planTier === "free" ? "canceled" : "active",
    },
    { where: { id: workspaceId } }
  );
}
