#!/usr/bin/env python3
"""Вшить свежие данные в панель, чтобы витрина показывала не вчерашний день.

Панель тянет наборы через fetch('данные/<файл>.json'). Локально это работает,
а на витрине нет: витрина отдаёт только файлы из папки публикаций, папки
«данные» там не существует, и fetch получает 404. Поэтому панель показывает
встроенную копию из блока <script id="данные-фолбэк">. Копию и обновляем.

Порядок: сначала завод/реестр-текстов.py, потом обновить-статьи.py,
и только затем этот скрипт.

Запуск: python3 панель/данные/обновить-фолбэк.py
"""

import json
from datetime import datetime
import subprocess
import sys
from pathlib import Path

ДАННЫЕ = Path(__file__).resolve().parent
ПАНЕЛЬ = ДАННЫЕ.parent / "index.html"
МЕТКА = '<script type="application/json" id="данные-фолбэк">'


def главная():
    # сначала возвращаем подписи из единого источника: наборы правят с разных
    # сторон, и «человеческие» пояснения при чужой перезаписи откатываются
    subprocess.run([sys.executable, str(ДАННЫЕ / "применить-подписи.py")], check=False)

    наборы = {}
    for файл in sorted(ДАННЫЕ.glob("*.json")):
        if ".бэкап" in файл.name or ".до-" in файл.name:
            continue
        if файл.stem == "подписи":
            continue  # источник текстов, панель его не читает
        наборы[файл.stem] = json.loads(файл.read_text(encoding="utf-8"))

    # Метка сборки: панель показывает её в шапке, чтобы было видно,
    # свежая ли открыта версия. 14.09.2026 руководитель дважды не увидела
    # правок - сервер отдавал новое, а в браузере оставалась прежняя загрузка.
    когда = datetime.now().strftime("%d.%m.%Y %H:%M")
    наборы.setdefault("report", {}).setdefault("мета", {})["собрано"] = когда
    # ...и в сам файл: на витрине папка «данные» отдаётся, и панель читает
    # файлы, а вшитую копию берёт только как запасной вариант. Без этой строки
    # метка была бы видна лишь там, где файлы недоступны.
    файл_отчёта = ДАННЫЕ / "report.json"
    отчёт_на_диске = json.loads(файл_отчёта.read_text(encoding="utf-8"))
    отчёт_на_диске.setdefault("мета", {})["собрано"] = когда
    файл_отчёта.write_text(json.dumps(отчёт_на_диске, ensure_ascii=False, indent=1),
                           encoding="utf-8")

    html = ПАНЕЛЬ.read_text(encoding="utf-8")
    начало = html.index(МЕТКА) + len(МЕТКА)
    конец = html.index("</script>", начало)
    было = len(html[начало:конец])

    свежее = json.dumps(наборы, ensure_ascii=False, separators=(",", ":"))
    # «</» внутри строк данных закрыл бы блок <script> раньше времени: страница
    # сломалась бы, а следующая пересборка нашла бы не тот конец блока.
    # В JSON «<\/» читается как «</». Опасно с 06.10.2026: во вшитую копию
    # едут поисковые запросы целиком, а их пишут чужие люди.
    свежее = свежее.replace("</", "<\\/")
    ПАНЕЛЬ.write_text(html[:начало] + свежее + html[конец:], encoding="utf-8")

    print("наборов вшито:", len(наборы), "-", ", ".join(наборы))
    print("размер копии: %d → %d знаков" % (было, len(свежее)))


if __name__ == "__main__":
    главная()
