#!/usr/bin/env python3
"""Разовая пересборка очереди контент-плана под раскладку от 07.09.2026.

Очередь в панели осталась от версии плана до собственного замера частотности:
опорой стояла А12, в неделях висели темы, которые после замера из волны вышли.
Скрипт кладёт в панель состав из `семантика/контент-план-волна-1.md`: десять
статей к написанию по неделям, вышедшее помечает как вышедшее, выведенное из
волны переводит в П2.

Дальше очередь ведёт `обновить-контент-план.py`: он проставляет статусы по
реестру текстов. Этот скрипт запускается один раз, при следующей пересборке
плана его правят, а не запускают вслепую.

Запуск: python3 панель/данные/пересобрать-очередь.py
"""

import json
from pathlib import Path

ДАННЫЕ = Path(__file__).resolve().parent
ПЛАН = ДАННЫЕ / "contentplan.json"
РЕЕСТР = ДАННЫЕ.parent.parent / "завод" / "реестр-текстов.json"

# «Что пишем дальше» из контент-плана: неделя, кластер, тема, показы, тип, контур
ПИШЕМ = [
    (1, "А26", "Что такое франшиза простыми словами", 13041, "опора ветки", "Франшизы"),
    (1, "Б10", "Открыть ИП пошагово", 260391, "инструкция", "Бизнес"),
    (2, "А16", "Сколько стоит франшиза на самом деле", 8339, "разбор", "Франшизы"),
    (2, "Б11", "Самозанятый или ИП", 52000, "разбор", "Бизнес"),
    (3, "А15", "Паушальный взнос и роялти", 6064, "разбор", "Франшизы"),
    (3, "Б1", "Бизнес-идеи с минимальными вложениями", 3881, "подборка", "Бизнес"),
    (4, "А6", "Топ франшиз: на что смотреть в рейтингах", 5329, "подборка", "Франшизы"),
    (4, "А20", "Как отличить настоящие отзывы от заказных", 3274, "разбор", "Франшизы"),
    (5, "А10", "Франшизы для действующего бизнеса", 2814, "разбор", "Франшизы"),
    (5, "А11", "Франшиза для малого бизнеса", 2263, "разбор", "Франшизы"),
]

# вышли из волны после замера: остаются в ядре, идут во вторую волну
ВЫВЕДЕНЫ = {
    "А12": "спрос ушёл в А26, роль опоры передана туда (150 показов)",
    "А4": "подборка ведёт в каталог, а его не будет до весны 2027 (639 показов)",
    "А17": "вся частотность темы лежит в «сколько стоит франшиза», А16 (336 показов)",
}
КАТАЛОГ = "А1"  # отложен руководителем 03.09.2026 примерно на полгода


def главная():
    план = json.loads(ПЛАН.read_text(encoding="utf-8"))
    реестр = json.loads(РЕЕСТР.read_text(encoding="utf-8"))
    вышли = {т["кластер"]: т["заголовок"] for т in реестр["тексты"]
             if "опубликовано на портале" in т["статус"].lower() and т.get("кластер")}
    старое = {п["кластер"]: п for п in план["очередь"]}
    новая, номер = [], 0

    def добавить(кластер, тема, неделя, статус, тип, контур, показы=None, нота=""):
        nonlocal номер
        номер += 1
        было = старое.get(кластер, {})
        новая.append({"позиция": номер, "кластер": кластер, "тема": тема,
                      "контур": было.get("контур", контур), "тип": тип,
                      "приоритет": было.get("приоритет", "P1"),
                      "объём": было.get("объём", "-"), "неделя": неделя,
                      "волна": "П1" if статус != "Отложена" else "П2",
                      "статус": статус, "показы": показы, "нота": нота,
                      "демо": False})

    # 1. уже вышедшее: порядок публикации важнее порядка плана
    for кластер, заголовок in sorted(вышли.items()):
        добавить(кластер, заголовок, "вышла", "Опубликована",
                 (старое.get(кластер) or {}).get("тип", "разбор"), "Франшизы")

    # 2. что пишем дальше
    for неделя, кластер, тема, показы, тип, контур in ПИШЕМ:
        if кластер in вышли:
            continue
        добавить(кластер, тема, str(неделя), "Запланирована", тип, контур, показы)

    # 3. выведенное из волны и отложенное
    for кластер, почему in ВЫВЕДЕНЫ.items():
        if кластер in вышли:
            continue
        было = старое.get(кластер, {})
        добавить(кластер, было.get("тема", кластер), "П2", "Отложена",
                 было.get("тип", "разбор"), "Франшизы", нота=почему)
    если_каталог = старое.get(КАТАЛОГ)
    if если_каталог:
        добавить(КАТАЛОГ, если_каталог["тема"], "весна 2027", "Отложена",
                 если_каталог["тип"], "Франшизы",
                 нота="каталог и карточки отложены руководителем 03.09.2026 примерно на полгода")

    # 4. остальное из прежней раскладки: в волну не вошло, но и не выброшено
    взяли = {п["кластер"] for п in новая}
    for кластер, поз in старое.items():
        if кластер in взяли:
            continue
        добавить(кластер, поз["тема"], "П2",
                 "Ждёт решения" if поз["статус"] == "Ждёт решения" else "Отложена",
                 поз["тип"], "Франшизы",
                 нота="в первую волну после замера 07.09.2026 не вошла")

    план["очередь"] = новая
    план["мета"]["источник"] = ("семантика/контент-план-волна-1.md, пересобран 07.09.2026 "
                                "по собственному замеру частотности; статусы сверяются с "
                                "завод/реестр-текстов.json скриптом обновить-контент-план.py")
    ПЛАН.write_text(json.dumps(план, ensure_ascii=False, indent=1), encoding="utf-8")
    print("позиций:", len(новая))
    for п in новая:
        print(f"  {п['позиция']:2} {п['кластер']:5} нед.{п['неделя']:11} {п['статус']:14} {п['тема'][:44]}")


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