// src/components/onboarding/steps/site-step.tsx — étape 1 du parcours d'entrée.
//
// Première étape réellement bloquante : tout le reste (mots-clés, pages,
// backlinks, Search Console, plan) se rattache à un site. Aucun bouton
// « Passer » n'y figure donc — la sortie de secours du wizard (/onboarding/defer)
// reste la seule échappatoire, et elle est posée par le wizard lui-même.
"use client";

import { useTranslations } from "next-intl";
import { useState, useTransition } from "react";
import { QuotaNotice } from "@/components/billing/quota-notice";
import { SiteForm } from "@/components/site/site-form";
import {
  Card,
  CardContent,
  CardDescription,
  CardHeader,
  CardTitle,
} from "@/components/ui/card";
import type { QuotaExceeded } from "@/lib/billing/quotas";
import { createSiteAction } from "@/lib/sites/actions";
import { writeActiveSiteCookie } from "@/lib/sites/active-site-client";
import type { SiteInput } from "@/lib/sites/schema";

export function SiteStep({ onCreated }: { onCreated: () => void }) {
  const t = useTranslations("Onboarding");
  const [pending, startTransition] = useTransition();
  const [error, setError] = useState<string | null>(null);
  const [quota, setQuota] = useState<QuotaExceeded | null>(null);

  function submit(input: SiteInput) {
    setError(null);
    setQuota(null);
    startTransition(async () => {
      try {
        // Le fan-out backlinks insère ~380 lignes : la latence est normale.
        const res = await createSiteAction(input);
        if (!res.ok) {
          if (res.quota) setQuota(res.quota);
          else setError(res.error);
          return;
        }
        // /onboarding est hors du groupe (app) : pas de SiteProvider, donc pas
        // de addSite(). On pose le cookie de site actif à la main, sans quoi la
        // suite du parcours travaillerait sans site actif.
        writeActiveSiteCookie(res.site.id);
        onCreated();
      } catch (e) {
        // createSiteAction LÈVE (et ne retourne pas) sur `Forbidden` et sur
        // toute panne DB. Sans ce catch la promesse rejetterait en silence :
        // le bouton se réactiverait et rien ne s'afficherait.
        console.error("[onboarding] createSiteAction failed", e);
        setError(t("siteError"));
      }
    });
  }

  return (
    <Card className="w-full max-w-lg">
      <CardHeader>
        <CardTitle>{t("siteTitle")}</CardTitle>
        <CardDescription>{t("siteHelp")}</CardDescription>
      </CardHeader>
      <CardContent className="flex flex-col gap-4">
        {/* Destination explicite : le lien par défaut de `QuotaNotice` vise
            `/settings/billing`, page du groupe (app) dont le layout renvoie au
            wizard tant que les étapes requises manquent — depuis ici, il
            ramènerait à cette même étape. La route de report pose le cookie
            avant de rediriger, donc la facturation s'ouvre vraiment. */}
        {quota ? (
          <QuotaNotice
            quota={quota}
            href={`/onboarding/defer?to=${encodeURIComponent("/settings/billing")}`}
          />
        ) : null}
        <SiteForm
          submitLabel={t("siteSubmit")}
          pending={pending}
          error={error}
          requireCountry
          onSubmit={submit}
        />
      </CardContent>
    </Card>
  );
}
