// src/lib/gsc/link-google-client.ts — flux de liaison Google Search Console
// (navigateur). Extrait de `gsc-connection-card` pour être partagé avec l'étape
// Search Console du wizard : DEUX écrans, UN seul flux, donc un seul scope
// demandé et un seul comportement d'erreur.
"use client";
import { authClient } from "@/lib/auth-client";
// Le scope DEMANDÉ est celui que `hasWebmastersScope` VÉRIFIE ensuite sur le
// compte lié : une seule constante, donc aucune divergence possible entre ce
// qu'on demande à Google et ce qu'on considère comme scopé.
import { WEBMASTERS_READONLY_SCOPE } from "./scope";

/**
 * Lance la liaison Google avec le scope Search Console. Flux redirect : en cas
 * de succès la page part chez Google, `callbackURL` reçoit le retour ; un refus
 * au callback OAuth (« Annuler » sur l'écran Google, `access_denied`) revient
 * sur `errorCallbackURL` avec un `?error=<code>`.
 *
 * `errorCallbackURL` n'est PAS un détail : sans lui, better-auth
 * (`oauth2/state.mjs`) retombe sur `onAPIError.errorURL` — que ce projet ne
 * configure pas — puis sur `${baseURL}/error`. L'utilisateur qui annule sort
 * alors du produit vers une page HTML brute : plus de carte, plus de sortie
 * « mon site est trop récent », plus de lien de report. Il rentre par défaut
 * sur `callbackURL`, pour que l'écran d'origine récupère son `?error=` et
 * puisse le dire.
 *
 * @returns `false` si la liaison a échoué AVANT la redirection — le client
 * Better Auth du dépôt n'a pas `throw: true` et résout `{ data, error }` au
 * lieu de lever ; le `catch` reste en ceinture pour les pannes réseau.
 */
export async function linkGoogleSearchConsole(
  callbackURL: string,
  errorCallbackURL: string = callbackURL,
): Promise<boolean> {
  try {
    const { error } = await authClient.linkSocial({
      provider: "google",
      scopes: [WEBMASTERS_READONLY_SCOPE],
      callbackURL,
      errorCallbackURL,
    });
    return !error;
  } catch {
    return false;
  }
}
