#!/usr/bin/env python3

import argparse
import html
import json
import shutil
from pathlib import Path

STATUS_LABELS = {
    "done": "ВЫПОЛНЕНО",
    "in_progress": "В РАБОТЕ",
    "pending": "ОЖИДАЕТ",
    "blocked": "ЗАБЛОКИРОВАНО",
}

STATUS_MARKERS = {
    "done": "[x]",
    "in_progress": "[ ] 🟡",
    "pending": "[ ]",
    "blocked": "[ ] 🔴",
}


def load_json(path: Path):
    with path.open(encoding="utf-8") as source:
        return json.load(source)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--state-dir", required=True)
    parser.add_argument("--output-dir", required=True)
    parser.add_argument("--generated-at", required=True)
    parser.add_argument("--source-step", required=True)
    parser.add_argument("--current-report", required=True)
    parser.add_argument("--architecture-plan", required=True)
    parser.add_argument("--xs-map", required=True)
    parser.add_argument("--global-plan", required=True)
    parser.add_argument("--previous-plan", required=True)
    args = parser.parse_args()

    state_dir = Path(args.state_dir)
    output_dir = Path(args.output_dir)
    output_dir.mkdir(parents=True, exist_ok=True)

    milestones = load_json(state_dir / "milestones.json")
    body = (state_dir / "canonical-plan.md").read_text(encoding="utf-8")

    entries = milestones["milestones"]

    counts = {
        status: sum(1 for item in entries if item["status"] == status)
        for status in STATUS_LABELS
    }

    total = len(entries)
    done = counts["done"]

    current = [
        item
        for item in entries
        if item["status"] == "in_progress"
    ]

    if not current:
        current = [
            item
            for item in entries
            if item["status"] == "pending"
        ][:1]

    lines = [
        "# Канонический локальный план VM101",
        "",
        "## Состояние реализации",
        "",
        f"- Версия схемы: `{milestones['schema_version']}`",
        f"- План: `{milestones['plan_id']}`",
        f"- Опубликовано: `{args.generated_at} UTC`",
        f"- Источник публикации: `{args.source_step}`",
        "- Область: **только VM101**",
        "- VM100 и VM121 не являются блокирующими критериями этого плана.",
        f"- Выполнено: **{done}/{total}**",
        "",
        "### Текущая точка",
        "",
    ]

    if current:
        for item in current:
            lines.append(
                f"- **{item['id']} — {item['title']}**"
            )

            if item.get("notes"):
                lines.append(f"  - {item['notes']}")
    else:
        lines.append("- Все этапы отмечены выполненными.")

    lines.extend([
        "",
        "## Реестр этапов",
        "",
    ])

    for item in entries:
        status = item["status"]
        marker = STATUS_MARKERS[status]
        label = STATUS_LABELS[status]

        lines.append(
            f"- {marker} **{item['id']} — {item['title']}** "
            f"— `{label}`"
        )

        if item.get("notes"):
            lines.append(f"  - {item['notes']}")

        for evidence in item.get("evidence", []):
            lines.append(f"  - Evidence: {evidence}")

    lines.extend([
        "",
        "## Ссылки текущей публикации",
        "",
        f"- CURRENT REPORT: {args.current_report}",
        f"- LOCAL ARCHITECTURE PLAN: {args.architecture_plan}",
        f"- XS MAP: {args.xs_map}",
        f"- GLOBAL PROJECT PLAN: {args.global_plan}",
        f"- PREVIOUS LOCAL PLAN: {args.previous_plan}",
        "",
        "---",
        "",
        body,
        "",
    ])

    plan_text = "\n".join(lines)

    (output_dir / "plan.md").write_text(
        plan_text,
        encoding="utf-8",
    )

    source_dir = output_dir / "source"
    source_dir.mkdir(exist_ok=True)

    for name in (
        "canonical-plan.md",
        "milestones.json",
        "render_plan.py",
        "set_status.py",
        "republish.sh",
        "README.md",
    ):
        source = state_dir / name

        if source.exists():
            shutil.copy2(source, source_dir / name)

    facts = {
        "schema": "vm101-local-plan-publication-v1",
        "generated_at_utc": args.generated_at,
        "source_step": args.source_step,
        "plan_id": milestones["plan_id"],
        "schema_version": milestones["schema_version"],
        "scope": milestones["scope"],
        "excluded_blocking_scopes":
            milestones["excluded_blocking_scopes"],
        "current_milestone":
            current[0]["id"] if current else None,
        "progress": {
            "total": total,
            **counts,
        },
        "milestones": entries,
        "publish": {
            "current_report": args.current_report,
            "architecture_plan": args.architecture_plan,
            "xs_map": args.xs_map,
            "global_project_plan": args.global_plan,
            "previous_plan": args.previous_plan,
        },
    }

    (output_dir / "facts.json").write_text(
        json.dumps(
            facts,
            ensure_ascii=False,
            indent=2,
        ) + "\n",
        encoding="utf-8",
    )

    milestone_rows = []

    for item in entries:
        status = STATUS_LABELS[item["status"]]

        milestone_rows.append(
            "<tr>"
            f"<td>{html.escape(item['id'])}</td>"
            f"<td>{html.escape(item['title'])}</td>"
            f"<td>{html.escape(status)}</td>"
            "</tr>"
        )

    index = f"""<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Канонический локальный план VM101</title>
<style>
body {{
  font-family: system-ui, sans-serif;
  max-width: 1100px;
  margin: 40px auto;
  padding: 0 20px;
  line-height: 1.5;
}}
table {{
  border-collapse: collapse;
  width: 100%;
}}
th, td {{
  border: 1px solid #bbb;
  padding: 8px;
  text-align: left;
}}
code {{
  background: #eee;
  padding: 2px 5px;
}}
</style>
</head>
<body>
<h1>Канонический локальный план VM101</h1>

<p>
Выполнено: <strong>{done}/{total}</strong><br>
Текущий этап:
<strong>{html.escape(current[0]['id'] if current else 'COMPLETE')}</strong>
</p>

<p>
<a href="plan.md">plan.md</a> ·
<a href="facts.json">facts.json</a> ·
<a href="source/">source/</a>
</p>

<h2>Этапы</h2>
<table>
<thead>
<tr>
<th>ID</th>
<th>Этап</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
{''.join(milestone_rows)}
</tbody>
</table>

<h2>Ссылки</h2>
<ul>
<li><a href="{html.escape(args.current_report)}">Current report</a></li>
<li><a href="{html.escape(args.architecture_plan)}">Architecture plan</a></li>
<li><a href="{html.escape(args.xs_map)}">XS Map</a></li>
<li><a href="{html.escape(args.global_plan)}">Global project plan</a></li>
<li><a href="{html.escape(args.previous_plan)}">Previous local plan</a></li>
</ul>
</body>
</html>
"""

    (output_dir / "index.html").write_text(
        index,
        encoding="utf-8",
    )


if __name__ == "__main__":
    main()
