#!/usr/bin/env python3
"""Пересчёт полей среза SEO, которые не требуют похода в API.

Зачем. Строка состояния («на портале 21 статья») и «Свой счёт» в карточке
посещаемости писались только выгрузками, которые ходят в Яндекс Вебмастер
и Метрику по ночам. Между выгрузками они отставали: 22.09.2026 на одном
экране стояли три разных числа статей портала - 21 в ленте, 22 в когортах
и 18 в своём счёте, при 22 по реестру и 23 слагах в логах.

Эти два поля считаются из наших же файлов - реестра текстов и счётчика по
логам, - поэтому обновляем их на каждой сборке, а не раз в сутки.

Порядок: после сайт/просмотры-из-логов.py и завод/реестр-текстов.py,
до обновить-фолбэк.py.
Запуск: python3 панель/данные/обновить-сводку-seo.py
"""

import json
import re
from pathlib import Path

ПАПКА = Path(__file__).resolve().parent
КОРЕНЬ = ПАПКА.parent.parent
ОТЧЁТ = ПАПКА / "report.json"
РЕЕСТР = КОРЕНЬ / "завод" / "реестр-текстов.json"
ПРОСМОТРЫ = КОРЕНЬ / "сайт" / "данные" / "просмотры.json"


def склонение(н, один, два, много):
    о, е = abs(н) % 100, abs(н) % 10
    if 11 <= о <= 14:
        return много
    return один if е == 1 else два if 2 <= е <= 4 else много


def статей_на_портале():
    if not РЕЕСТР.exists():
        return None
    р = json.loads(РЕЕСТР.read_text(encoding="utf-8"))
    return sum(1 for т in р.get("тексты", [])
               if "опубликовано на портале" in str(т.get("статус") or "").lower())


def свой_счёт():
    """Просмотры статей портала из счётчика по логам nginx."""
    if not ПРОСМОТРЫ.exists():
        return None
    д = json.loads(ПРОСМОТРЫ.read_text(encoding="utf-8"))
    статьи = д.get("статьи") or {}
    всего = sum((з or {}).get("всего") or 0 for з in статьи.values())
    return {"просмотров": всего, "статей": len(статьи),
            "снято": д.get("обновлено")}


def главная():
    отчёт = json.loads(ОТЧЁТ.read_text(encoding="utf-8"))
    seo = отчёт.get("seo") or {}
    изменено = []

    статей = статей_на_портале()
    if статей is not None:
        # В строке состояния число статей стоит словами: «на портале 21 статья».
        # Подменяем только его, остальное пишет выгрузка Вебмастера.
        было = str(seo.get("состояние") or "")
        стало = re.sub(r"на портале \d+ [А-Яа-яё]+",
                       f"на портале {статей} " + склонение(статей, "статья", "статьи", "статей"),
                       было)
        if стало != было:
            seo["состояние"] = стало
            изменено.append(f"состояние: статей портала -> {статей}")
        # то же число в пояснении к индексации
        инд = seo.get("индексация") or {}
        если = str(инд.get("пояснение") or "")
        новое = re.sub(r"на портале \d+ [А-Яа-яё]+",
                       f"на портале {статей} " + склонение(статей, "статья", "статьи", "статей"),
                       если)
        if новое != если:
            инд["пояснение"] = новое
            изменено.append("пояснение индексации")

    счёт = свой_счёт()
    if счёт:
        п = seo.setdefault("посещаемость", {})
        если_было = п.get("свой_счёт") or {}
        if если_было != счёт:
            п["свой_счёт"] = счёт
            изменено.append(f"свой счёт: {счёт['просмотров']} у {счёт['статей']} статей")

    ОТЧЁТ.write_text(json.dumps(отчёт, ensure_ascii=False, indent=1) + "\n",
                     encoding="utf-8")
    print("сводка SEO: " + ("; ".join(изменено) if изменено else "менять нечего"))
    return 0


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