"""Construye visualization_settings para smartscalar con comparacion anotherColumn."""

from __future__ import annotations

from .metabase_viz_column_format import metabase_viz_column_format


def metabase_smartscalar_anothercolumn_viz(
    *,
    main_column: str,
    compare_column: str,
    label: str = "vs N-1",
    number_style: str = "percent",
    decimals: int = 2,
    currency: str = "EUR",
    comparison_id: str = "cmp_n1",
) -> dict:
    """Construye visualization_settings para smartscalar con comparacion anotherColumn.

    Genera el dict completo de ``visualization_settings`` para una card con
    ``display=smartscalar`` que muestra ``main_column`` con una comparacion
    de tipo ``anotherColumn`` apuntando a ``compare_column`` (ambas columnas
    en la misma fila del query).

    Este patron es util cuando el query devuelve directamente el valor actual
    y el valor de comparacion como columnas separadas (en lugar del patron de
    2 filas temporales de ``previousValue``).

    Args:
        main_column: Nombre de la columna que se muestra como valor principal
            en el smartscalar. Debe coincidir exactamente con el nombre de
            columna en el resultado del query.
        compare_column: Nombre de la columna que se usa como valor de
            comparacion. Debe estar en el mismo resultado del query que
            ``main_column``.
        label: Etiqueta mostrada bajo el delta de comparacion. Default
            ``"vs N-1"``.
        number_style: Estilo de formato para ambas columnas. Valores:
            ``"percent"``, ``"currency"``, ``"decimal"``, ``""`` (default
            Metabase). Default ``"percent"``.
        decimals: Numero de decimales para ambas columnas. Default ``2``.
        currency: Codigo ISO de moneda (``"EUR"``, ``"USD"``, ...). Solo
            relevante cuando ``number_style="currency"``. Default ``"EUR"``.
        comparison_id: Identificador interno de la comparacion dentro del
            array ``scalar.comparisons``. Debe ser unico por card. Default
            ``"cmp_n1"``.

    Returns:
        Dict con la estructura completa de ``visualization_settings``::

            {
                "scalar.field": "<main_column>",
                "scalar.comparisons": [
                    {"id": "<comparison_id>", "type": "anotherColumn",
                     "column": "<compare_column>", "label": "<label>"},
                ],
                "column_settings": {
                    '["name","<main_column>"]': {...formato...},
                    '["name","<compare_column>"]': {...mismo formato...},
                },
            }

    Example:
        >>> viz = metabase_smartscalar_anothercolumn_viz(
        ...     main_column="Margen",
        ...     compare_column="MargenN1",
        ...     label="vs N-1",
        ...     number_style="percent",
        ...     decimals=2,
        ... )
        >>> assert viz["scalar.field"] == "Margen"
        >>> assert viz["scalar.comparisons"][0]["type"] == "anotherColumn"
        >>> assert viz["scalar.comparisons"][0]["column"] == "MargenN1"
        >>> assert '["name","Margen"]' in viz["column_settings"]
        >>> assert '["name","MargenN1"]' in viz["column_settings"]

        >>> # Con formato moneda
        >>> viz = metabase_smartscalar_anothercolumn_viz(
        ...     main_column="Venta",
        ...     compare_column="VentaN1",
        ...     label="vs ano anterior",
        ...     number_style="currency",
        ...     decimals=0,
        ...     currency="EUR",
        ... )
    """
    # Argumentos de formato comunes a ambas columnas
    fmt_kwargs: dict = {
        "number_style": number_style,
        "decimals": decimals,
    }
    if number_style == "currency" and currency:
        fmt_kwargs["currency"] = currency
        fmt_kwargs["currency_in_header"] = False

    column_settings: dict = {}
    column_settings.update(metabase_viz_column_format(main_column, **fmt_kwargs))
    column_settings.update(metabase_viz_column_format(compare_column, **fmt_kwargs))

    return {
        "scalar.field": main_column,
        "scalar.comparisons": [
            {
                "id": comparison_id,
                "type": "anotherColumn",
                "column": compare_column,
                "label": label,
            }
        ],
        "column_settings": column_settings,
    }
