from __future__ import annotations

import importlib.util
import sys
from pathlib import Path


REPO_ROOT = Path(__file__).resolve().parents[1]
SCRIPT_PATH = REPO_ROOT / ".agents/skills/requirements-from-pdf/scripts/requirements_from_pdf.py"
PDF_PATH = Path(
    "/home/smaje/Documentos/Works/2026/cidti4.0/Reuniones/Informe de Reunión con Cliente - epicrisisia - 28-04-2026.pdf"
)


def load_module():
    spec = importlib.util.spec_from_file_location("requirements_from_pdf", SCRIPT_PATH)
    module = importlib.util.module_from_spec(spec)
    assert spec.loader is not None
    sys.modules[spec.name] = module
    spec.loader.exec_module(module)
    return module


def test_parse_case_uses_extracts_expected_entries():
    module = load_module()
    text = """
5.1.   M1. Ingesta y gestión documental

CU-01. Unificar la vista documental del caso
Historia de usuario: Como auditor o analista del caso, quiero ver en una sola interfaz todos los documentos cargados y generados para revisar el expediente sin cambiar de contexto ni perder trazabilidad.
Resultado esperado: El sistema presenta historia clínica, factura, laboratorios y RIPS en una vista consolidada.

5.2.   M2. Normalización semántica clínica
CU-03. Normalizar terminología clínica y abreviaturas
Historia de usuario: Como auditor clínico, quiero que el sistema reconozca equivalencias terminológicas y abreviaturas médicas para disminuir errores de interpretación.
Resultado esperado: El procesamiento identifica variaciones semánticas y deja evidencia de las normalizaciones aplicadas.

9. Priorización sugerida
Fase 1. Consolidación por caso, interfaz documental unificada y RIPS.
Fase 2. Capa semántica clínica y supervisión humana.
"""
    case_uses = module.parse_case_uses(text)
    assert [case.cu_code for case in case_uses] == ["CU-01", "CU-03"]
    assert case_uses[0].module_code == "M1"
    assert case_uses[0].priority == "p0"
    assert case_uses[1].module_code == "M2"
    assert case_uses[1].priority == "p1"


def test_compact_wrapped_lines_rejoins_pdf_hyphenation():
    module = load_module()
    compacted = module.compact_wrapped_lines(["Resultado esperado: El procesamiento identifica térmi-", "nos equivalentes."])
    assert compacted == ["Resultado esperado: El procesamiento identifica términos equivalentes."]


def test_detect_merge_targets_handles_split_rips_merge(tmp_path):
    module = load_module()
    export_req = tmp_path / "REQ024.md"
    export_req.write_text(
        """---
active: true
status: completed
source_file: x
source_section: y
tags:
- module-m4
- category-rips-exportacion-backend
---

# HU-40 – Generar y exportar RIPS del caso consolidado

## Historia

Como usuario, quiero exportar RIPS para obtener una salida estructurada.

## Observaciones
""",
        encoding="utf-8",
    )
    version_req = tmp_path / "REQ023.md"
    version_req.write_text(
        """---
active: true
status: completed
source_file: x
source_section: y
tags:
- module-m4
- category-versionado-trazabilidad
---

# HU-39 – Definir el modelo de persistencia RIPS en MongoDB por caso procesado

## Historia

Como técnico, quiero versionar y persistir RIPS con trazabilidad.

## Observaciones
""",
        encoding="utf-8",
    )
    existing = [module.parse_existing_req(version_req), module.parse_existing_req(export_req)]
    case_use = module.CaseUse(
        section_label="5.4",
        module_code="M4",
        module_name="RIPS y soporte de facturación",
        cu_code="CU-09",
        title="Exportar y versionar RIPS",
        story="Como usuario operativo, quiero exportar el RIPS y conservar su versión generada para evitar regeneraciones innecesarias.",
        expected_result="Cada exportación queda registrada con versión, fecha, insumos y estado de validación.",
        phase=1,
        priority="p0",
        priority_note="Fase 1",
        category_tag="category-versionado-trazabilidad",
        facets={"rips", "export", "version"},
    )
    targets, warnings = module.detect_merge_targets(case_use, existing)
    assert [target.req_id for target in targets] == ["REQ023", "REQ024"]
    assert warnings == []


def test_apply_preview_writes_new_req_and_updates_canonical(tmp_path):
    module = load_module()
    backlog_dir = tmp_path / "req"
    backlog_dir.mkdir()
    canonical = backlog_dir / "REQ024.md"
    canonical.write_text(
        """---
active: true
status: completed
source_file: evidence
source_section: old
tags:
- module-m4
- category-rips-exportacion-backend
---

# HU-40 – Generar y exportar RIPS del caso consolidado

## Historia

Como usuario, quiero exportar RIPS para obtener una salida estructurada.

## Notas tecnicas

* Nota original.

## Observaciones

- Observación original.
""",
        encoding="utf-8",
    )
    pdf = tmp_path / "meeting.pdf"
    pdf.write_bytes(b"fake pdf")
    case_use = module.CaseUse(
        section_label="5.4",
        module_code="M4",
        module_name="RIPS y soporte de facturación",
        cu_code="CU-09",
        title="Exportar y versionar RIPS",
        story="Como usuario operativo, quiero exportar el RIPS y conservar su versión generada para evitar regeneraciones innecesarias.",
        expected_result="Cada exportación queda registrada con versión, fecha, insumos y estado de validación.",
        phase=1,
        priority="p0",
        priority_note="Fase 1",
        category_tag="category-versionado-trazabilidad",
        facets={"rips", "export", "version"},
    )
    draft = module.DraftRequirement(
        req_number=55,
        hu_number=58,
        case_use=case_use,
        merge_targets=[module.MergeCandidate(req_id="REQ024", path=canonical, reason="cubre exportación RIPS")],
        warnings=[],
    )
    plan = module.PreviewPlan(
        pdf_path=pdf,
        backlog_dir=backlog_dir,
        meeting_slug="meeting-2026-04-28",
        examples=[],
        covered=[],
        drafts=[draft],
        touched_files=[backlog_dir / "REQ055.md", canonical],
        warnings=[],
    )
    module.apply_preview(plan)
    created = (backlog_dir / "REQ055.md").read_text(encoding="utf-8")
    updated = canonical.read_text(encoding="utf-8")
    assert "status: merged" in created
    assert "Fusionada en: `REQ024`" in created
    assert "Consolida por fusión el alcance derivado de `REQ055 / HU-58`" in updated
    assert "Referencia por fusion: `REQ055` -> HU-58" in updated
