#!/usr/bin/env python3
"""update-status.py — генерирует свежий status.json на сервере.

Запускать НА СЕРВЕРЕ:
    python3 /var/www/opt.rodnoy.site/admin/scripts/update-status.py

Записывает в /var/www/opt.rodnoy.site/admin/data/status.json
(вызывает внутри себя bash /var/www/opt.rodnoy.site/admin/scripts/health-check.sh
и парсит JSON-секцию из его вывода).
"""
import json
import os
import subprocess
import sys
from datetime import datetime, timezone
from pathlib import Path

ADMIN_DIR = Path("/var/www/opt.rodnoy.site/admin")
SCRIPTS_DIR = ADMIN_DIR / "scripts"
DATA_DIR = ADMIN_DIR / "data"
STATUS_FILE = DATA_DIR / "status.json"

# 1) Запускаем health-check.sh и забираем последний JSON-блок
def collect_health():
    result = subprocess.run(
        ["bash", str(SCRIPTS_DIR / "health-check.sh")],
        capture_output=True, text=True, timeout=60
    )
    text = result.stdout
    # Извлекаем JSON (последний {...} блок)
    start = text.rfind("\n{")
    if start == -1:
        return {"_error": "no JSON in health-check output", "_raw": text[-500:]}
    json_text = text[start + 1:]
    # Обрезаем до последней закрывающей скобки
    end = json_text.rfind("\n}")
    if end != -1:
        json_text = json_text[:end + 2]
    try:
        return json.loads(json_text)
    except json.JSONDecodeError as e:
        return {"_error": str(e), "_raw": json_text[:500]}

# 2) Дополнительные метаданные
def collect_meta():
    meta = {}
    # Активные Task IDs (читаем worklog.md если есть)
    worklog = Path("/home/z/my-project/worklog.md")
    if not worklog.exists():
        worklog = ADMIN_DIR / "data" / "WORKLOG.md"
    if worklog.exists():
        meta["worklog_path"] = str(worklog)
        meta["worklog_size"] = worklog.stat().st_size
    # Метка времени
    meta["generated_at"] = datetime.now(timezone.utc).isoformat()
    # Версия проекта (читаем VERSION если есть)
    version_file = ADMIN_DIR / "data" / "VERSION"
    if version_file.exists():
        meta["version"] = version_file.read_text().strip()
    else:
        meta["version"] = "v0.1.0"
    return meta

# 3) Список известных страниц
def collect_pages():
    pages = {}
    root = Path("/var/www/opt.rodnoy.site")
    for p in sorted(root.rglob("*.html")):
        rel = p.relative_to(root)
        try:
            rel_str = str(rel)
            url = "https://opt.rodnoy.site/" + rel_str.replace("index.html", "")
            pages[rel_str] = {
                "url": url,
                "size": p.stat().st_size,
                "modified": datetime.fromtimestamp(p.stat().st_mtime, tz=timezone.utc).isoformat(),
            }
        except Exception:
            pass
    return pages

# 4) Скрипты
def collect_scripts():
    scripts = {}
    for p in sorted((SCRIPTS_DIR).glob("*")):
        if p.is_file():
            scripts[p.name] = {
                "url": f"https://opt.rodnoy.site/admin/scripts/{p.name}",
                "size": p.stat().st_size,
                "modified": datetime.fromtimestamp(p.stat().st_mtime, tz=timezone.utc).isoformat(),
            }
    return scripts


def main():
    DATA_DIR.mkdir(parents=True, exist_ok=True)
    snapshot = {
        "schema_version": "1.0",
        "generated_at": datetime.now(timezone.utc).isoformat(),
        "meta": collect_meta(),
        "health": collect_health(),
        "pages": collect_pages(),
        "scripts": collect_scripts(),
    }
    STATUS_FILE.write_text(json.dumps(snapshot, indent=2, ensure_ascii=False))
    print(f"[update-status] wrote {STATUS_FILE} ({STATUS_FILE.stat().st_size} bytes)")
    print(json.dumps(snapshot["health"], indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()
