#!/usr/bin/env python3
"""Показать в панели письма, пришедшие с формы на сайте.

Форма на странице «Связаться с нами» складывает письма на сервер
(`сайт/данные/письма/`). Пересылка на Frantlas@yandex.ru пока не включена:
хостер режет исходящий SMTP, а внешний шлюз решили не подключать. Значит
письмо могут не заметить — поэтому счётчик стоит на видном месте, в
сводном отчёте, вместе с датой последнего письма.

Порядок: до обновить-фолбэк.py (он вшивает наборы в панель).

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

import json
import sys
from datetime import datetime, timedelta
from pathlib import Path

КОРЕНЬ = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(КОРЕНЬ / "сайт"))
import письма as почта  # noqa: E402

ОТЧЁТ = КОРЕНЬ / "панель" / "данные" / "report.json"
МЕТКА = "писем с сайта"
ПОКАЗЫВАЕМ = 50    # последние письма; остальные читаются на сервере
ОБРЕЗКА = 700      # длинное письмо в таблице не читают, полное лежит в файле


def главная():
    все = почта.все()
    неделя = datetime.now().astimezone() - timedelta(days=7)
    свежих = sum(1 for п in все
                 if datetime.fromisoformat(п["когда"]) > неделя)
    ждут = [п for п in все if not п.get("доставлено")]

    if ждут:
        комментарий = ("лежат на сервере в сайт/данные/письма, на почту не "
                       "пересылаются: хостер режет SMTP, внешний шлюз не "
                       "подключали. Не пересланных: %d, последнее %s. "
                       "Смотреть: python3 сайт/письма.py"
                       % (len(ждут), ждут[-1]["когда"][:16]))
    else:
        комментарий = ("форма на /kontakty/ принимает письма на сервер, "
                       "смотреть их: python3 сайт/письма.py")

    отчёт = json.loads(ОТЧЁТ.read_text(encoding="utf-8"))

    свежие = sorted(все, key=lambda п: п["когда"], reverse=True)[:ПОКАЗЫВАЕМ]
    отчёт["seo"]["письма"] = {
        "заголовок": "Письма с сайта",
        "подпись": ("Форма на странице «Связаться с нами». Письма приходят на наш "
                    "сервер и лежат в сайт/данные/письма — на почту они пока не "
                    "пересылаются: хостер режет исходящий SMTP, внешний шлюз не "
                    "подключали. Отвечать надо руками, с почты редакции."),
        "всего": len(все),
        "не_переслано": len(ждут),
        "показано": len(свежие),
        "строки": [{"когда": п["когда"],
                    "имя": п["имя"],
                    "почта": п["почта"],
                    "тема": п["тема"],
                    "текст": (п["текст"][:ОБРЕЗКА] + "…"
                              if len(п["текст"]) > ОБРЕЗКА else п["текст"]),
                    "откуда": п.get("откуда") or "",
                    "доставлено": п.get("доставлено")} for п in свежие],
    }

    kpi = отчёт["seo"]["kpi"]
    строка = {"метка": МЕТКА, "значение": len(все), "демо": False,
              "комментарий": комментарий}
    for i, к in enumerate(kpi):
        if к.get("метка") == МЕТКА:
            kpi[i] = строка
            break
    else:
        kpi.append(строка)
    ОТЧЁТ.write_text(json.dumps(отчёт, ensure_ascii=False, indent=1), encoding="utf-8")
    print("писем всего %d, за неделю %d, ждут ответа %d" % (len(все), свежих, len(ждут)))


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