from app.services.template_variables import (
    analyze_template_variables,
    extract_template_variables,
    field_code_candidates,
)


SAMPLE = """
EN COPIAPÓ, a [ot.fecha.larga], comparece [compareciente.1.nombreInformal],
[compareciente.1.profesion], con domicilio en [compareciente.1.direccion],
[compareciente.1.comuna], RUT [compareciente.1.rut].
Entidad: {{notaria.nombre}}, {{notaria.direccion}}, {{notaria.ciudad}}.
"""


def test_extracts_square_and_curly_variables_without_duplicates():
    variables = extract_template_variables(SAMPLE + " [ot.fecha.larga]")
    assert variables[0] == "ot.fecha.larga"
    assert variables.count("ot.fecha.larga") == 1
    assert "notaria.ciudad" in variables


def test_native_variables_do_not_create_fields():
    result = analyze_template_variables(
        "[ot.fecha.larga] [notaria.direccion] [compareciente.1.rut]", []
    )
    assert result["resumen"]["nativas"] == 3
    assert result["resumen"]["faltantes"] == 0
    assert all(item["creable"] is False for item in result["variables"])


def test_compareciente_variable_reuses_legacy_customer_field():
    fields = [{
        "id": 120,
        "codigo": "cliente_profesion",
        "etiqueta": "Profesión del cliente",
        "activo": True,
    }]
    result = analyze_template_variables("[compareciente.1.profesion]", fields)
    variable = result["variables"][0]
    assert variable["estado"] == "CAMPO_EXISTENTE"
    assert variable["codigo"] == "cliente_profesion"
    assert variable["campo_id"] == 120


def test_disabled_field_is_not_available_to_the_template():
    fields = [{
        "id": 120,
        "codigo": "cliente_profesion",
        "etiqueta": "Profesión del cliente",
        "activo": False,
    }]
    result = analyze_template_variables("[compareciente.1.profesion]", fields)
    variable = result["variables"][0]
    assert variable["estado"] == "CAMPO_INACTIVO"
    assert result["resumen"]["inactivas"] == 1
    assert result["resumen"]["existentes"] == 0


def test_missing_compareciente_variable_has_safe_suggestion():
    result = analyze_template_variables("[compareciente.1.nacionalidad]", [])
    variable = result["variables"][0]
    assert variable["estado"] == "CAMPO_FALTANTE"
    assert variable["codigo"] == "compareciente_1_nacionalidad"
    assert variable["tipo_sugerido"] == "TEXTO"
    assert variable["requerido_sugerido"] is True


def test_compareciente_alias_candidates_are_stable():
    assert field_code_candidates("compareciente.1.direccion") == [
        "compareciente_1_direccion",
        "cliente_direccion",
        "direccion_cliente",
        "direccion_compareciente",
        "compareciente_direccion",
    ]


def test_unknown_native_family_is_reserved():
    variable = analyze_template_variables("[ot.campo.no_implementado]", [])["variables"][0]
    assert variable["estado"] == "RESERVADA"
    assert variable["creable"] is False
