"""Construye entradas de column_settings para visualization_settings de Metabase."""

from __future__ import annotations

import json


def metabase_viz_column_format(
    column: str,
    *,
    number_style: str = "",
    decimals: int = -1,
    currency: str = "",
    currency_in_header: bool | None = None,
    suffix: str = "",
    prefix: str = "",
) -> dict:
    """Construye la entrada column_settings para una columna en visualization_settings.

    Genera la clave con el formato JSON exacto que espera Metabase
    (``'["name","<columna>"]'``) y el dict de formato con solo los campos
    que se han especificado explicitamente (omite vacios y valores centinela).

    El resultado esta pensado para fusionarse (``dict.update`` o ``|``) en
    ``visualization_settings["column_settings"]``.

    Args:
        column: Nombre exacto de la columna tal como aparece en el resultado
            del query (sensible a mayusculas).
        number_style: Estilo de formato numerico. Valores validos:
            ``""`` (sin estilo, usa el default de Metabase),
            ``"currency"``, ``"percent"``, ``"decimal"``, ``"scientific"``.
        decimals: Numero de decimales a mostrar. ``-1`` = omitir (Metabase
            usa su default automatico).
        currency: Codigo ISO de moneda (``"EUR"``, ``"USD"``, ...). Solo
            relevante cuando ``number_style="currency"``. Vacio = omitir.
        currency_in_header: Si ``True`` muestra el simbolo de moneda en la
            cabecera de columna en lugar de junto al valor. ``None`` = omitir.
        suffix: Sufijo textual mostrado tras el valor (ej. ``"%"``). Vacio = omitir.
        prefix: Prefijo textual mostrado antes del valor. Vacio = omitir.

    Returns:
        Dict con una sola clave — el string JSON ``'["name","<column>"]'`` —
        y como valor un dict con los campos de formato que se han especificado.
        El dict de formato puede estar vacio si no se paso ningun parametro
        de formato.

    Example:
        >>> metabase_viz_column_format("Margen", number_style="percent", decimals=2)
        {'["name","Margen"]': {"number_style": "percent", "decimals": 2}}

        >>> metabase_viz_column_format(
        ...     "MasadeMargen",
        ...     number_style="currency",
        ...     currency="EUR",
        ...     decimals=0,
        ...     currency_in_header=False,
        ... )
        {'["name","MasadeMargen"]': {"number_style": "currency", "currency": "EUR", "decimals": 0, "currency_in_header": False}}
    """
    # Clave: array JSON serializado sin espacios adicionales
    key = json.dumps(["name", column], separators=(",", ":"))

    fmt: dict = {}

    if number_style:
        fmt["number_style"] = number_style

    if decimals >= 0:
        fmt["decimals"] = decimals

    if currency:
        fmt["currency"] = currency

    if currency_in_header is not None:
        fmt["currency_in_header"] = currency_in_header

    if suffix:
        fmt["suffix"] = suffix

    if prefix:
        fmt["prefix"] = prefix

    return {key: fmt}
