#!/usr/bin/env python3
"""Вернуть панели её подписи из единого источника.

Зачем. Наборы `панель/данные/*.json` правят сразу с нескольких сторон:
скрипты завода, ручные правки, параллельные сессии. Цифры и строки таблиц
пересобираются легко, а «человеческие» пояснения при чужой перезаписи
молча откатываются к старым. Так 04.09.2026 в разделе «Статьи» снова
появилось «Домена нет, аккаунтов на площадках нет», хотя домен работал
третий день.

Поэтому все такие тексты живут в одном файле `подписи.json`, а этот скрипт
накатывает их поверх наборов. Он вызывается из `обновить-фолбэк.py`, то есть
срабатывает при каждой сборке панели — вручную звать не нужно.

В текстах можно ставить подстановки, они считаются из реестра:
    {портал}    - сколько статей опубликовано на портале
    {площадки}  - сколько материалов вышло на внешних площадках
    {всего}     - сколько текстов написано всего
    {сегодня}   - дата сборки панели в виде 2026-09-07

Запуск (обычно не нужен, вызывается сам):
    python3 панель/данные/применить-подписи.py
"""

import json
from datetime import date
from pathlib import Path

ДАННЫЕ = Path(__file__).resolve().parent
ИСТОЧНИК = ДАННЫЕ / "подписи.json"
РЕЕСТР = ДАННЫЕ.parent.parent / "завод" / "реестр-текстов.json"


def подстановки():
    if not РЕЕСТР.exists():
        return {}
    р = json.loads(РЕЕСТР.read_text(encoding="utf-8"))
    портал = sum(1 for т in р["тексты"] if "опубликовано на портале" in т["статус"])
    площадки = sum(1 for т in р["тексты"]
                   if т["вид"] == "внешняя площадка" and "опубликовано" in т["статус"])
    return {"портал": портал, "площадки": площадки, "всего": р["итоги"]["всего"],
            "сегодня": date.today().isoformat()}


def главная():
    if not ИСТОЧНИК.exists():
        return print("нет %s: подписи не заданы" % ИСТОЧНИК.name)
    подписи = json.loads(ИСТОЧНИК.read_text(encoding="utf-8"))
    числа = подстановки()
    возвращено = []

    for набор, поля in подписи.items():
        if набор.startswith("_"):
            continue
        файл = ДАННЫЕ / (набор + ".json")
        if not файл.exists():
            print("  пропускаю %s: файла нет" % набор)
            continue
        д = json.loads(файл.read_text(encoding="utf-8"))
        д.setdefault("мета", {})
        изменено = False
        for ключ, текст in поля.items():
            свежий = текст.format(**числа) if числа else текст
            if д["мета"].get(ключ) != свежий:
                д["мета"][ключ] = свежий
                изменено = True
                возвращено.append("%s.%s" % (набор, ключ))
        if изменено:
            файл.write_text(json.dumps(д, ensure_ascii=False, indent=1), encoding="utf-8")

    if возвращено:
        print("подписи восстановлены:", ", ".join(возвращено))
    else:
        print("подписи на месте, править нечего")


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