"""Melt (unpivot) para datos tabulares list[dict]."""


def melt(
    rows: list[dict],
    id_vars: list[str],
    value_vars: list[str] | None = None,
    var_name: str = "variable",
    value_name: str = "value",
) -> list[dict]:
    """Convierte columnas en filas (formato largo). Inversa de pivot.

    Cada combinacion de id_vars + value_var genera una fila nueva.
    Si value_vars es None, se usan todas las columnas que no esten en id_vars.

    Args:
        rows: Lista de dicts en formato ancho.
        id_vars: Columnas que se mantienen como identificadores en cada fila.
        value_vars: Columnas a convertir en filas. None = todas las no-id.
        var_name: Nombre de la columna que contendra los nombres de variables.
        value_name: Nombre de la columna que contendra los valores.

    Returns:
        Lista de dicts en formato largo con una fila por combinacion id+variable.
    """
    result = []
    for row in rows:
        # Determinar que columnas derretir
        if value_vars is None:
            vars_to_melt = [k for k in row if k not in id_vars]
        else:
            vars_to_melt = value_vars

        for var in vars_to_melt:
            new_row: dict = {k: row.get(k) for k in id_vars}
            new_row[var_name] = var
            new_row[value_name] = row.get(var)
            result.append(new_row)

    return result
