"""Лог запросов /recommend (JSONL)."""

from __future__ import annotations

import json
import logging
import os
import threading
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional

logger = logging.getLogger(__name__)
_LOCK = threading.Lock()


class PredictionLogger:
    """
    Пишет каждый запрос recommend в JSONL-файл.

    Retention (12 месяцев) — задача оркестратора/cron очистки.
    """

    def __init__(self, log_path: Optional[Path] = None):
        default = os.getenv("PREDICTION_LOG_PATH", "/app/models/predictions.jsonl")
        self.log_path = Path(log_path or default)
        self.log_path.parent.mkdir(parents=True, exist_ok=True, mode=0o777)
        self.enabled = os.getenv("PREDICTION_LOG_ENABLED", "true").lower() not in {"0", "false", "no"}

    def log(
        self,
        *,
        articles: List[str],
        height: Any,
        weight: Any,
        shoe_size: Any,
        results: List[Dict[str, Any]],
        model_version: Optional[int],
    ) -> None:
        """
        Добавляет одну запись в лог предсказаний.

        :param articles: Входные артикулы.
        :param height: Рост.
        :param weight: Вес.
        :param shoe_size: Размер обуви.
        :param results: Ответ predict.
        :param model_version: Активная версия модели.
        """
        if not self.enabled:
            return
        record = {
            "ts": datetime.utcnow().isoformat(),
            "model_version": model_version,
            "input": {
                "articles": articles,
                "height": height,
                "weight": weight,
                "shoe_size": shoe_size,
            },
            "output": results,
        }
        line = json.dumps(record, ensure_ascii=False)
        try:
            with _LOCK:
                with open(self.log_path, "a", encoding="utf-8") as f:
                    f.write(line + "\n")
        except Exception as e:
            logger.warning("Prediction log write failed: %s", e)
