import { ExternalLink } from 'lucide-react'

import { Button } from '@/components/ui/button'
import { t } from '@/lib/i18n'

/** Las pantallas de Google donde se resuelve algo del producto. */
export type GoogleScreen =
  | 'project'
  | 'enable-api'
  | 'enable-indexing-api'
  | 'service-accounts'
  | 'search-console'

/**
 * La **única** tabla de direcciones de Google del producto.
 *
 * Estaban escritas cuatro veces: el mapa `GOOGLE_SCREENS` del recorrido, tres
 * constantes sueltas en Configuración, el mapa de motivos de
 * `CredentialErrorPanel` y dos copias idénticas de la función que le pega el
 * proyecto a la dirección. Google renombra pantallas de su consola sin avisar, y
 * con cuatro copias la que se actualiza es la que alguien miró ese día.
 *
 * `project` decide si la dirección acepta el identificador del proyecto. Las dos
 * pantallas que no lo aceptan no son un olvido: crear un proyecto es lo que pasa
 * cuando todavía no hay ninguno, y Search Console no es parte de Google Cloud,
 * así que no conoce proyectos.
 */
const SCREENS: Record<GoogleScreen, { url: string; scoped: boolean }> = {
  project: { url: 'https://console.cloud.google.com/projectcreate', scoped: false },
  'enable-api': {
    url: 'https://console.cloud.google.com/apis/library/searchconsole.googleapis.com',
    scoped: true,
  },
  // Otra API y otra pantalla, aunque sea el mismo proyecto. En la biblioteca de
  // Google Cloud figura como «Web Search Indexing API», que es el nombre que hay
  // que buscar; el identificador del servicio sigue siendo `indexing`.
  'enable-indexing-api': {
    url: 'https://console.cloud.google.com/apis/library/indexing.googleapis.com',
    scoped: true,
  },
  'service-accounts': {
    url: 'https://console.cloud.google.com/iam-admin/serviceaccounts',
    scoped: true,
  },
  'search-console': { url: 'https://search.google.com/search-console', scoped: false },
}

/**
 * La dirección de una pantalla de Google, con el proyecto puesto si lo acepta.
 *
 * Se exporta aparte del botón porque el panel de errores de credencial arma su
 * fila de acciones con la misma tabla, y porque una dirección se puede
 * comprobar sin dibujar nada.
 */
export function googleConsoleUrl(screen: GoogleScreen, projectId = ''): string {
  const { url, scoped } = SCREENS[screen]
  if (!scoped || !projectId) return url
  return `${url}?project=${encodeURIComponent(projectId)}`
}

interface Props {
  screen: GoogleScreen
  /** El identificador del proyecto declarado. Puede llegar vacío. */
  projectId?: string | null
  /** El rótulo. Dice a qué pantalla lleva, nunca «Acá». */
  children: string
  variant?: 'outline' | 'default'
}

/**
 * El atajo a una pantalla de Google.
 *
 * Siempre en otra pestaña y siempre diciéndolo: quien está a mitad de un paso no
 * puede perder la pantalla que le explica cómo hacerlo, y quien usa un lector de
 * pantalla necesita enterarse de que el foco se fue a otro lado antes de
 * apretar.
 */
export function GoogleConsoleLink({ screen, projectId, children, variant = 'outline' }: Props) {
  return (
    <Button asChild size="sm" variant={variant}>
      <a
        href={googleConsoleUrl(screen, projectId ?? '')}
        target="_blank"
        rel="noreferrer noopener"
      >
        {children}
        <ExternalLink aria-hidden />
        <span className="sr-only">{t('common.opensInNewTab')}</span>
      </a>
    </Button>
  )
}
