"""
core/warmup_resume.py — persist/restore прогрева через рестарты приложения.

Прогрев — длительная задача (до 21 дня). Автообновление софта или случайный
рестарт не должны сбивать её: при старте payload запуска перехватывается,
и если процесс был прерван с running-статусом, прогрев поднимается сам.
"""
import json
import logging
import time
from pathlib import Path
from typing import Optional

from config import DATA_DIR

logger = logging.getLogger("telepush.warmup_resume")

_SNAPSHOT_FILE = DATA_DIR / "warmup_resume.json"
_MAX_SNAPSHOT_AGE_SEC = 7 * 24 * 3600  # неделя — дальше перезапускать смысла нет


def save_snapshot(uid: int, payload: dict, current_day: int):
    """Сохраняет исходные настройки запуска прогрева + текущий день."""
    try:
        snap = {
            "uid": int(uid),
            "payload": payload or {},
            "current_day": int(current_day),
            "saved_at": time.time(),
        }
        _SNAPSHOT_FILE.parent.mkdir(parents=True, exist_ok=True)
        _SNAPSHOT_FILE.write_text(
            json.dumps(snap, ensure_ascii=False, indent=2),
            encoding="utf-8",
        )
    except Exception as e:
        logger.debug("save_snapshot error: %s", e)


def update_current_day(current_day: int):
    """Обновляет текущий день в существующем snapshot (без перезаписи payload)."""
    try:
        if not _SNAPSHOT_FILE.exists():
            return
        data = json.loads(_SNAPSHOT_FILE.read_text(encoding="utf-8"))
        data["current_day"] = int(current_day)
        data["saved_at"] = time.time()
        _SNAPSHOT_FILE.write_text(
            json.dumps(data, ensure_ascii=False, indent=2),
            encoding="utf-8",
        )
    except Exception as e:
        logger.debug("update_current_day error: %s", e)


def load_snapshot() -> Optional[dict]:
    """Возвращает snapshot если он валиден и не устарел."""
    try:
        if not _SNAPSHOT_FILE.exists():
            return None
        data = json.loads(_SNAPSHOT_FILE.read_text(encoding="utf-8"))
        if not isinstance(data, dict) or "payload" not in data:
            return None
        saved_at = float(data.get("saved_at") or 0)
        if saved_at and (time.time() - saved_at) > _MAX_SNAPSHOT_AGE_SEC:
            clear_snapshot()
            return None
        return data
    except Exception as e:
        logger.debug("load_snapshot error: %s", e)
        return None


def clear_snapshot():
    try:
        _SNAPSHOT_FILE.unlink(missing_ok=True)
    except Exception:
        pass
