// Server-only helpers for activating subscriptions from paid payments.
import type { SupabaseClient } from "@supabase/supabase-js";
import type { Database } from "@/integrations/supabase/types";

type Admin = SupabaseClient<Database>;

export async function activateSubscriptionForPayment(
  admin: Admin,
  paymentId: string,
): Promise<{ ok: boolean; subscription_id?: string; error?: string }> {
  const { data: payment, error: pErr } = await admin
    .from("payments")
    .select("id, subscription_id, status")
    .eq("id", paymentId)
    .maybeSingle();
  if (pErr || !payment) return { ok: false, error: pErr?.message ?? "Payment not found" };
  if (!payment.subscription_id) return { ok: false, error: "Payment has no subscription" };

  const { data: sub, error: sErr } = await admin
    .from("subscriptions")
    .select("id, plan_id, status, starts_at, expires_at")
    .eq("id", payment.subscription_id)
    .maybeSingle();
  if (sErr || !sub) return { ok: false, error: sErr?.message ?? "Subscription not found" };

  if (sub.status === "active" && sub.expires_at) {
    return { ok: true, subscription_id: sub.id };
  }

  const { data: plan } = await admin
    .from("plans")
    .select("duration_minutes")
    .eq("id", sub.plan_id)
    .maybeSingle();
  const minutes = plan?.duration_minutes ?? 60;
  const now = new Date();
  const expires = new Date(now.getTime() + minutes * 60_000);

  await admin
    .from("subscriptions")
    .update({
      status: "active",
      starts_at: now.toISOString(),
      expires_at: expires.toISOString(),
    })
    .eq("id", sub.id);

  return { ok: true, subscription_id: sub.id };
}
