#!/usr/bin/env python3
"""Блок «Узнаваемость бренда» для панели: спрос на имя портала в Яндексе.

Собран по образцу PR Factory («Ядро розничных запросов»). Смысл тот же:
просмотры показывают, сколько людей увидело материал, а брендовый спрос -
сколько из них запомнило имя и потом искало его само. Это единственная
метрика, где внешние публикации видны не охватом, а следом.

Данные - семантика/бренд-журнал.csv, его пишет семантика/замер-бренда.py.
Своя история, а не выгрузка: помесячный ряд Wordstat приходит за фиксированное
окно 2025 года и на параметры периода не отзывается (проверено 23.09.2026).

Что кладём в панель:
  сейчас / было / сдвиг     - сумма по всем формам имени на последний и первый замер
  запросы                   - по каждой форме: ряд замеров и последнее число
  ряд                       - сумма по датам, для графика
  старт                     - 03.09.2026, первая внешняя публикация: линия
                              «до/после» на графике, как в эталоне

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

import json
from collections import OrderedDict
from datetime import date
from pathlib import Path

КОРЕНЬ = Path(__file__).resolve().parent.parent.parent
ЖУРНАЛ = КОРЕНЬ / "семантика" / "бренд-журнал.csv"
ОТЧЁТ = Path(__file__).resolve().parent / "report.json"

# Первая публикация на внешней площадке. До неё бренда не знал никто,
# после - начинается всё, что мы меряем.
СТАРТ = "2026-09-03"


def замеры():
    """{дата: {запрос: показов}} - пустые числа пропускаем, это «не мерили»."""
    если = OrderedDict()
    if not ЖУРНАЛ.exists():
        return если
    for строка in ЖУРНАЛ.read_text(encoding="utf-8").splitlines():
        if not строка or строка.startswith("#") or строка.startswith("дата;"):
            continue
        ч = строка.split(";")
        if len(ч) < 3 or not ч[0].startswith("20") or not ч[2].strip().isdigit():
            continue
        если.setdefault(ч[0], {})[ч[1].strip()] = int(ч[2])
    return если


def собрать():
    зам = замеры()
    if not зам:
        return {
            "статус": "замеров не было",
            "почему": ("журнал семантика/бренд-журнал.csv пуст: запустите "
                       "python3 семантика/замер-бренда.py"),
        }
    даты = sorted(зам)
    первая, последняя = даты[0], даты[-1]
    ряд = [{"дата": д, "показов": sum(зам[д].values())} for д in даты]

    # По каждой форме имени: последнее число и весь ряд.
    имена = sorted({ф for д in зам.values() for ф in д},
                   key=lambda ф: -(зам[последняя].get(ф, 0)))
    запросы = [{
        "запрос": ф,
        "сейчас": зам[последняя].get(ф),
        "было": зам[первая].get(ф),
        "ряд": [зам[д].get(ф) for д in даты],
    } for ф in имена]

    сейчас = sum(зам[последняя].values())
    было = sum(зам[первая].values())
    return {
        "статус": "меряем",
        "заголовок": "Узнаваемость бренда: спрос на имя в Яндексе",
        "подпись": ("Сколько раз в месяц ищут «франтлас»: человек запомнил имя "
                    "и искал сам. Wordstat, Россия."),
        "сейчас": сейчас,
        "было": было,
        "сдвиг": сейчас - было,
        "первый_замер": первая,
        "последний_замер": последняя,
        "замеров": len(даты),
        "даты": даты,
        "подписи": [f"{д[8:10]}.{д[5:7]}" for д in даты],
        "ряд": [т["показов"] for т in ряд],
        "запросы": запросы,
        "старт": СТАРТ,
        "старт_подпись": "первая публикация на внешней площадке",
        "оговорка": (
            "Своя история, а не выгрузка из Wordstat: помесячный ряд там отдаётся "
            "за фиксированное окно 2025 года. Копим замерами раз в неделю, поэтому "
            "точка на графике - дата замера, а не месяц. "
            "Числа этого порядка (десятки показов) - шум: опечатки и случайные "
            "наборы, а не читатели. Уточняющих запросов у Wordstat по бренду нет "
            "вовсе. Ждём, когда ряд начнёт расти устойчиво."),
    }


def главная():
    блок = собрать()
    отчёт = json.loads(ОТЧЁТ.read_text(encoding="utf-8"))
    отчёт["pr"]["бренд"] = блок
    ОТЧЁТ.write_text(json.dumps(отчёт, ensure_ascii=False, indent=1) + "\n",
                     encoding="utf-8")
    if блок.get("статус") == "меряем":
        print(f"бренд: {блок['замеров']} замеров, сейчас {блок['сейчас']} "
              f"показов в месяц по {len(блок['запросы'])} формам имени")
    else:
        print("бренд:", блок.get("почему"))
    return 0


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