#!/usr/bin/env python3
"""Перечень площадок для вкладки панели.

Раньше список жил отдельной страницей на витрине (завод/таблица-площадок.py).
14.09.2026 руководитель попросила перенести его в панель вкладкой и оформить
в общем стиле. Чтобы состояния площадок не разошлись между двумя списками,
логику не переписываем: импортируем её из того же скрипта и берём готовые
функции - группировку, счёт публикаций и просмотров.

Пишет: панель/данные/platforms.json (панель читает как набор «platforms»).
Порядок: после обновить-просмотры.py, до обновить-фолбэк.py.
Запуск: python3 панель/данные/обновить-перечень-площадок.py
"""

import importlib.util
import json
from datetime import date
from pathlib import Path

ПАПКА = Path(__file__).resolve().parent
КОРЕНЬ = ПАПКА.parent.parent
ТАБЛИЦА = КОРЕНЬ / "завод" / "таблица-площадок.py"
ИСТОЧНИК = КОРЕНЬ / "завод" / "площадки.json"
ВЫХОД = ПАПКА / "platforms.json"


def модуль_таблицы():
    """Импорт скрипта с дефисом в имени: обычный import его не возьмёт."""
    спец = importlib.util.spec_from_file_location("таблица_площадок", ТАБЛИЦА)
    м = importlib.util.module_from_spec(спец)
    спец.loader.exec_module(м)
    return м


def главная():
    т = модуль_таблицы()
    данные = json.loads(ИСТОЧНИК.read_text(encoding="utf-8"))
    свой_домен = "frantlas.ru"
    площадки = [x for x in данные["площадки"]
                if isinstance(x, dict) and x.get("имя") and not т.снята(x)
                and свой_домен not in str(x.get("url") or "")]

    вышло = т.публикации()
    невидимые = т.невидимые_записи()
    просм = т.просмотры_по_площадкам()

    строки = []
    for x in площадки:
        группа = т.группа(x, вышло, невидимые)
        имя = x["имя"]
        замер = просм.get(имя) or {}
        строки.append({
            "площадка": имя,
            "адрес": str(x.get("url") or ""),
            # Ссылка на наш профиль: по клику из панели видно, как аккаунт
            # выглядит читателю. Собирает завод/собрать-профили.py.
            "профиль": str(x.get("профиль") or ""),
            "профиль_откуда": str(x.get("профиль_откуда") or ""),
            "состояние": т.ГРУППЫ[группа],
            "группа": группа,
            "что_сейчас": т.кратко(x.get("статус"), 220),
            "ценность": x.get("ценность_для_нас"),
            "публикаций": вышло.get(т.имя_площадки(имя), вышло.get(имя, 0)),
            # словарь вида {сумма, мерено, нет_счётчика}: панели нужно само число,
            # а «счётчика нет вовсе» и «не мерили» - разные вещи, разводим их нотой
            "просмотров": замер.get("сумма") if замер.get("мерено") else None,
            "просмотров_нота": ("нет счётчика" if замер.get("нет_счётчика")
                                 else ("" if замер.get("мерено") else "не мерили")),
            # Сколько дней площадка не двигается. Без этого поля статья
            # E-xecutive провисела на модерации десять дней, и панель
            # показывала ровно то же, что в первый день (21.09.2026).
            "ждём_дней": т.ждём_дней(x.get("статус")),
            "ссылки": т.ссылки(x),
            # Можно ли ставить ссылку на портал и с какого материала по счёту
            # (просьба руководителя 01.10.2026). Правило живёт в карточке
            # площадки, а «сколько уже вышло» панель берёт из поля «публикаций»:
            # так строка сама переходит в «можно» после нужной публикации.
            "ссылка_на_портал": x.get("ссылка_на_портал_правило") or None,
            "телефон": т.телефон(x),
            "телефон_нота": x.get("телефон_примечание") or "",
            "доступ": bool(x.get("доступ")),
            "тип": x.get("тип") or "",
            "демо": False,
        })

    # Порядок как в отдельной таблице: сперва те, где уже вышли материалы,
    # внутри группы - по ценности. Так сверху то, что работает.
    строки.sort(key=lambda с: (с["группа"], -(с["ценность"] or 0), с["площадка"]))

    счёт = {}
    for с in строки:
        счёт[с["состояние"]] = счёт.get(с["состояние"], 0) + 1

    набор = {
        "мета": {
            "раздел": "Площадки",
            "пояснение": ("Внешние площадки. Состояние - по факту публикаций, "
                          "отклонённые скрыты."),
            "источник": "завод/площадки.json (карточки ведём руками) и завод/реестр-текстов.json",
            "собрано": date.today().isoformat(),
            "счёт": счёт,
            "всего": len(строки),
            "отклонено": sum(1 for x in данные["площадки"]
                             if isinstance(x, dict) and т.снята(x)),
            "демо": False,
        },
        "строки": строки,
    }
    ВЫХОД.write_text(json.dumps(набор, ensure_ascii=False, indent=2), encoding="utf-8")
    печать = ", ".join(f"{к}: {в}" for к, в in счёт.items())
    print(f"площадок в перечне: {len(строки)} ({печать}); отклонённых скрыто: {набор['мета']['отклонено']}")
    без_правила = [с["площадка"] for с in строки if not с["ссылка_на_портал"]]
    if без_правила:
        print("  нет правила ссылок на портал (поле ссылка_на_портал_правило в карточке): "
              + ", ".join(без_правила))


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