import type { ActionFunctionArgs, LoaderFunctionArgs } from "react-router";
import { redirect } from "react-router";
import { authenticate } from "../shopify.server";
import { BillingService } from "../services/billing.server";
import { getDefaultStoreDomainSync } from "../services/platform-settings.server";

/**
 * Authoritative Server-Side Shopify Subscription Initiation Endpoint.
 *
 * Flow:
 * POST /billing/subscribe { plan: "STARTER" | "PRO" }
 *   ↓
 * Authenticate Shopify Shop
 *   ↓
 * Determine requested plan from trusted server-side plan identifier
 *   ↓
 * Create Shopify App Subscription via Shopify Billing API
 *   ↓
 * Receive Shopify confirmation URL
 *   ↓
 * Redirect merchant into official Shopify subscription approval flow
 *
 * CRITICAL SECURITY:
 * Never accepts or processes raw payment credentials or custom payment forms.
 * All subscriptions are billed through Shopify's official App Subscription API.
 * Prices are strictly determined by the backend; frontend prices are never trusted.
 */

export const action = async ({ request }: ActionFunctionArgs) => {
  let shopDomain = "";
  let sessionAccessToken = "";
  try {
    const { session } = await authenticate.admin(request);
    shopDomain = session.shop;
    sessionAccessToken = session.accessToken || "";
  } catch {
    const url = new URL(request.url);
    shopDomain = url.searchParams.get("shop") || getDefaultStoreDomainSync();
  }

  const formData = await request.formData();
  const requestedPlan = String(formData.get("plan") || "").toUpperCase();

  if (requestedPlan !== "STARTER" && requestedPlan !== "PRO") {
    return new Response(
      JSON.stringify({ error: "Invalid plan. Only 'STARTER' or 'PRO' plans can be subscribed via Shopify." }),
      { status: 400, headers: { "Content-Type": "application/json" } }
    );
  }

  const appUrl = process.env.SHOPIFY_APP_URL || new URL(request.url).origin;
  const returnUrl = `${appUrl}/app/billing?sync=true&plan=${requestedPlan}`;

  const subscription = await BillingService.createSubscription({
    shopDomainOrId: shopDomain,
    plan: requestedPlan,
    returnUrl,
    explicitAccessToken: sessionAccessToken,
  });

  return redirect(subscription.confirmationUrl);
};

export const loader = async ({ request }: LoaderFunctionArgs) => {
  let shopDomain = "";
  try {
    const { session } = await authenticate.admin(request);
    shopDomain = session.shop;
  } catch {
    const url = new URL(request.url);
    shopDomain = url.searchParams.get("shop") || getDefaultStoreDomainSync();
  }

  const url = new URL(request.url);
  const requestedPlan = String(url.searchParams.get("plan") || "").toUpperCase();

  if (requestedPlan !== "STARTER" && requestedPlan !== "PRO") {
    return redirect("/app/billing");
  }

  const appUrl = process.env.SHOPIFY_APP_URL || url.origin;
  const returnUrl = `${appUrl}/app/billing?sync=true&plan=${requestedPlan}`;

  const subscription = await BillingService.createSubscription({
    shopDomainOrId: shopDomain,
    plan: requestedPlan,
    returnUrl,
  });

  return redirect(subscription.confirmationUrl);
};
