from __future__ import annotations

import json
import sqlite3
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "scripts" / "health"))
sys.path.insert(0, str(ROOT / "tests"))

from dashboard_v5.read_api import dispatch_api  # noqa: E402
from dashboard_v5.render import render  # noqa: E402
from dashboard_v5.data_provider import build_bundle  # noqa: E402
from fixtures.dashboard_v5_fixture import build_dashboard_v5_fixture  # noqa: E402


def fixture(tmp_path: Path) -> Path:
    database = tmp_path / "a3.db"
    build_dashboard_v5_fixture(database)
    return database


def test_nutrition_day_exposes_products_meals_macros_coverage_without_internal_ids(tmp_path):
    database = fixture(tmp_path)
    payload = dispatch_api(database, "/api/v1/nutrition/day/2026-06-14", "")
    expected_coverage = {
        "status": "incomplete",
        "item_count": 2,
        "unknown_items": 1,
        "mapping_coverage": 0.5,
        "insufficient_inputs": "no_index",
    }
    assert expected_coverage.items() <= payload["coverage"].items()
    assert payload["coverage"]["mapped_items"] == 1
    assert payload["coverage"]["open_items"] == 1
    assert 0 <= payload["coverage"]["nutrient_coverage"] <= 1
    assert {meal["meal"] for meal in payload["meals"]} == {
        "breakfast", "lunch", "dinner", "snack", "unassigned"
    }
    assert len(payload["items"]) == 2
    unmapped = next(item for item in payload["items"] if item["histamine"]["status"] == "unmapped")
    assert unmapped["mapping_queue_key"] and len(unmapped["mapping_queue_key"]) == 32
    assert unmapped["source"] in {"YAZIO", "Weitere dokumentierte Ernährungsquelle"}
    assert payload["histamine"]["score"] is None
    serialized = json.dumps(payload)
    for forbidden in ("raw_item_json", "raw_product_json", "source_item_id", "source_product_id", "credential"):
        assert forbidden not in serialized


def test_nutrition_day_links_only_an_exact_open_mapping_queue_row(tmp_path):
    database = fixture(tmp_path)
    with sqlite3.connect(database) as connection:
        connection.execute("DELETE FROM nutrition_review_queue")
    payload = dispatch_api(database, "/api/v1/nutrition/day/2026-06-14", "")
    unmapped = next(item for item in payload["items"] if item["histamine"]["status"] == "unmapped")
    assert unmapped["mapping_queue_key"] is None


def test_unreviewed_document_preview_is_separate_and_review_state_unchanged(tmp_path, monkeypatch):
    database = fixture(tmp_path)
    originals = tmp_path / "originals"
    originals.mkdir()
    original = originals / "pending.pdf"
    original.write_bytes(b"%PDF-1.7\nsynthetic")
    with sqlite3.connect(database) as connection:
        connection.execute(
            """INSERT INTO dokumente(datei_name,dateipfad,local_original_path,daten_typ,kategorie,
                   institution,review_status,document_date,extrahierte_inhalte,datei_hash)
               VALUES(?,?,?,?,?,?,?,?,?,?)""",
            ("pending.pdf", str(original), str(original), "pdf", "A3", "Synthetic", "nicht_geprueft", "2026-07-10", "SYNTHETIC MACHINE TEXT", "a3-hash"),
        )
    monkeypatch.setenv("HEALTH_DASHBOARD_ORIGINAL_ROOTS", str(originals))
    listing = dispatch_api(database, "/api/v1/documents", "category=A3")
    item = listing["documents"][0]
    assert item["original_status"] == "available"
    assert item["extraction_status"] == "extracted"
    assert item["review_status"] == "nicht_geprueft"
    assert item["search_status"] == "extracted_not_reviewed"
    preview = dispatch_api(database, f"/api/v1/documents/{item['id']}/extracted-preview", "")
    assert preview["notice"] == "Maschinell extrahierter Inhalt – noch nicht inhaltlich geprüft"
    assert preview["sections"][0]["text"] == "SYNTHETIC MACHINE TEXT"
    with sqlite3.connect(database) as connection:
        assert connection.execute("SELECT review_status FROM dokumente WHERE kategorie='A3'").fetchone()[0] == "nicht_geprueft"
        has_fts = connection.execute("SELECT 1 FROM sqlite_master WHERE type='table' AND name='health_document_fts'").fetchone()
        fts = connection.execute("SELECT count(*) FROM health_document_fts WHERE document_id=(SELECT CAST(id AS TEXT) FROM dokumente WHERE kategorie='A3')").fetchone()[0] if has_fts else 0
    assert fts == 0
    report = dispatch_api(
        database,
        "/api/v1/doctor-report",
        "from=2026-07-01&to=2026-07-17&sections=overview,documents",
    )
    assert all(document["id"] != item["id"] for document in report["documents"])
    assert all(document["id"] != item["id"] for document in report["overview"]["documents"])


def test_contextual_range_markup_and_day_controls(tmp_path):
    database = fixture(tmp_path)
    with sqlite3.connect(database) as connection:
        connection.row_factory = sqlite3.Row
        bundle = build_bundle(connection, today="2026-06-15", generated_at="2026-06-15T12:00:00+00:00")
    mapping = bundle["nutrition"]["mapping_review"][0]
    assert mapping["status"] == "suggestion_available"
    assert mapping["first_seen"] <= mapping["last_seen"] <= "2026-06-15"
    assert "reason" not in mapping
    html = render(bundle, explorer_6c=True, calendar_day_6d=True, health_record_6e=True)
    assert "data-context-range" in html
    assert "aria-label='Ansichtsspezifischer Zeitraum' hidden" in html
    assert "data-header-today-open" in html and "data-header-day-shift" in html
    assert "data-day-previous" in html and "data-day-next" in html and "data-day-today" in html
    assert "data-day-header-date" not in html
