// src/components/gsc/gsc-connection-card.tsx — état du compte Google de
// l'utilisateur COURANT (page /gsc). L'autorité GSC est portée par le site, pas
// par l'org : cette carte ne parle donc plus du propriétaire de l'organisation,
// seulement de « mon » compte et de ce qu'il voit.
"use client";

import { useSearchParams } from "next/navigation";
import { type ReactElement, useState } from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import type { GscStatus } from "@/lib/gsc/actions";
import { linkGoogleSearchConsole } from "@/lib/gsc/link-google-client";

// linkSocial est un flux redirect : l'échec de liaison se produit côté serveur
// au callback OAuth, qui renvoie sur /gsc?error=<code>. Sans lecture de ce
// paramètre, l'échec est invisible (la page revient inchangée). Codes émis par
// better-auth (api/routes/callback.mjs).
const CALLBACK_ERRORS: Record<string, string> = {
  account_already_linked_to_different_user:
    "Ce compte Google est déjà relié à un autre utilisateur SEO Insight.",
  "email_doesn't_match":
    "L'email du compte Google ne correspond pas à ton email d'inscription.",
  unable_to_link_account: "La liaison du compte Google a été refusée.",
};

function countLabel(count: number): string {
  return count === 1 ? "1 propriété vérifiée" : `${count} propriétés vérifiées`;
}

/** Décompte des propriétés vérifiées — jamais affirmé plus fort que la donnée.
 *  `propertiesError` veut dire qu'au moins un compte Google n'a pas répondu
 *  (jeton révoqué, panne sites.list) : le décompte n'est alors plus une mesure
 *  mais un plancher, et zéro ne veut plus rien dire. Dire « aucune propriété
 *  vérifiée » dans ce cas, c'est produire mot pour mot la phrase que
 *  `actions.ts` (commentaire du chemin `getAccessToken` sans jeton) se refuse à
 *  produire — et contredire, à l'écran, l'alerte que la carte des propriétés
 *  affiche au même instant. */
function propertiesLabel(count: number, incomplete: boolean): string {
  if (incomplete) {
    return count === 0
      ? "impossible de lister tes propriétés Search Console pour l'instant."
      : `${countLabel(count)} au moins — la liste est incomplète.`;
  }
  // Le zéro a sa propre phrase : « 0 propriété vérifiée » se lit comme un bug,
  // « aucune » comme un état.
  return count === 0
    ? "aucune propriété vérifiée sur ce compte."
    : `${countLabel(count)}.`;
}

export function GscConnectionCard({ status }: { status: GscStatus }) {
  const searchParams = useSearchParams();
  const callbackError = searchParams.get("error");
  const [error, setError] = useState<string | null>(() =>
    callbackError
      ? (CALLBACK_ERRORS[callbackError] ??
        "La connexion Google a échoué — réessaie.")
      : null,
  );

  async function connect() {
    setError(null);
    // Flux partagé avec l'étape Search Console du wizard (link-google-client) :
    // le scope demandé et le traitement d'erreur n'existent qu'à un seul
    // endroit. `false` = échec AVANT la redirection ; un refus survenu côté
    // Google revient par `?error=` sur la callbackURL, lu plus haut.
    if (!(await linkGoogleSearchConsole("/gsc"))) {
      setError("La connexion Google a échoué — réessaie.");
    }
  }

  /** `switch` exhaustif, pas une chaîne de ternaires terminée par un
   *  fourre-tout : le type de retour exclut `undefined`, donc une quatrième
   *  valeur de `myGoogle` casserait la compilation au lieu d'afficher en
   *  silence « aucun compte connecté » avec le mauvais bouton. */
  function stateBlock(): ReactElement {
    switch (status.myGoogle) {
      case "linked":
        return (
          <div className="flex flex-col items-start gap-2">
            <p className="text-muted-foreground text-sm">
              Compte Google connecté ✓ —{" "}
              {propertiesLabel(
                status.properties.length,
                status.propertiesError,
              )}
            </p>
            {/* Le multi-compte est un flux normal ici (cas agence) : sans ce
                bouton, un consultant dont la propriété vit sur un second
                compte Google n'a aucun moyen de la faire apparaître. */}
            <Button variant="outline" onClick={connect}>
              Lier un autre compte Google
            </Button>
          </div>
        );
      case "missing-scope":
        return (
          <div className="flex flex-col items-start gap-2">
            <p className="text-muted-foreground text-sm">
              Compte Google connecté, mais sans l'accès Search Console —
              reconnecte-le en cochant la case Search Console sur l'écran
              Google.
            </p>
            <Button onClick={connect}>Reconnecter Google Search Console</Button>
          </div>
        );
      case "none":
        return (
          <div className="flex flex-col items-start gap-2">
            <p className="text-muted-foreground text-sm">
              Aucun compte Google connecté. Connecte le tien pour mapper tes
              propriétés Search Console à tes sites.
            </p>
            <Button onClick={connect}>Connecter Google Search Console</Button>
          </div>
        );
    }
  }

  return (
    <Card>
      <CardHeader>
        <CardTitle>Mon compte Google</CardTitle>
      </CardHeader>
      <CardContent className="flex flex-col gap-4">
        {error ? (
          <p className="text-destructive text-sm" role="alert">
            {error}
          </p>
        ) : null}
        {stateBlock()}
      </CardContent>
    </Card>
  );
}
