"""
Las herramientas que ofrece la plataforma.

El producto dejó de ser una sola herramienta. Lo que hasta ahora era **la**
aplicación es hoy **una** de sus herramientas —Search Console—, y la raíz pasó a
ser el lugar donde se elige con cuál trabajar.

La lista vive acá y no en la pantalla por el mismo motivo por el que las rutas
publicadas viven en `apps/core/routes.py`: qué herramientas existen es una
decisión del servidor. Una pantalla que arme su propia lista muestra lo que
alguien escribió a mano, no lo que la plataforma tiene.

Ya son dos —Search Console y SEO—, y agregar la segunda costó exactamente lo que
esta tupla prometía: una línea. La raíz dejó de ser una pantalla con un solo
elemento y pasó a ser lo que decía ser.
"""

from dataclasses import dataclass


@dataclass(frozen=True)
class Tool:
    """
    Una herramienta, con lo mínimo para poder elegirla.

    El `code` es el identificador estable —el mismo que abre su prefijo de
    dirección— y es **también** con lo que la pantalla busca su nombre y su
    descripción en el catálogo. El nombre no viaja desde acá: «Search Console»
    se llama igual en los dos idiomas, pero la frase que explica qué hace no.
    """

    code: str
    #: El **nombre** de la ruta, no su dirección. La arma el cliente con
    #: `route()`, que es como se resuelve toda dirección en este producto: así
    #: mover una herramienta de prefijo no obliga a tocar esta tabla.
    route: str


#: Las herramientas publicadas, en el orden en que se ofrecen.
#:
#: Search Console va primera porque es la que tiene el recorrido guiado y la
#: conexión con Google: SEO se apoya en esa credencial, así que ofrecerla antes
#: mandaría a una herramienta que todavía no puede funcionar.
TOOLS: tuple[Tool, ...] = (
    Tool(code='search-console', route='search_console'),
    Tool(code='seo', route='seo'),
)


def available_tools(account) -> list[dict]:
    """
    Las herramientas que esta cuenta puede abrir.

    Hoy las devuelve todas: no hay ninguna que dependa del plan ni de un permiso.
    El filtro existe igual porque el lugar donde se decide eso tiene que ser
    éste, y no la pantalla: cuando una herramienta sea de un plan y otra no, la
    diferencia se resuelve acá y ninguna vista se entera.
    """
    return [{'code': tool.code, 'route': tool.route} for tool in TOOLS]
