import { CircleHelp, CircleSlash, CircleX, Hourglass, Send } from 'lucide-react'
import type { LucideIcon } from 'lucide-react'

import { StatusBadge } from '@/components/StatusBadge'
import type { StatusTone } from '@/components/StatusBadge'
import { t } from '@/lib/i18n'
import type { TranslationKey } from '@/lib/i18n'

/**
 * En qué punto está el pedido de indexación de una dirección.
 *
 * **Este eje no comparte paleta con el de cobertura, y es deliberado.** «Le
 * pedimos a Google que la mire» y «Google dice que está indexada» son dos
 * afirmaciones distintas, y la única razón por la que este producto existe es
 * poder sostener la primera sin fingir la segunda. Dos badges del mismo verde
 * en la misma fila las encimarían en la cabeza de quien lee, que es donde
 * importa.
 *
 * Por eso `SENT` es `neutral` y no `positive`: un envío que salió bien no es un
 * resultado bueno, es un hecho registrado. El verde diría que la página quedó
 * indexada, que es exactamente lo que nadie de este lado puede afirmar.
 */
const INDEXING_STATES: Record<string, { icon: LucideIcon; tone: StatusTone }> = {
  PENDING: { icon: Hourglass, tone: 'unknown' },
  SENT: { icon: Send, tone: 'neutral' },
  ERROR: { icon: CircleX, tone: 'critical' },
  // Ni error ni éxito: alguien decidió no mandarla. Es una decisión registrada,
  // así que se dibuja como lo que no ocurrió y no como algo que salió mal.
  REMOVED: { icon: CircleSlash, tone: 'unknown' },
}

interface Props {
  state: string
  className?: string
}

export function IndexingStateBadge({ state, className }: Props) {
  const definition = INDEXING_STATES[state]

  if (!definition) {
    return (
      <StatusBadge tone="neutral" icon={CircleHelp} className={className}>
        {state}
      </StatusBadge>
    )
  }

  return (
    <StatusBadge
      tone={definition.tone}
      icon={definition.icon}
      help={indexingStateHelp(state)}
      className={className}
    >
      {indexingStateLabel(state)}
    </StatusBadge>
  )
}

export function indexingStateLabel(state: string): string {
  if (!INDEXING_STATES[state]) return state
  return t(`indexing.state.${state}.label` as TranslationKey)
}

export function indexingStateHelp(state: string): string {
  if (!INDEXING_STATES[state]) return ''
  return t(`indexing.state.${state}.help` as TranslationKey)
}
