"""
Fossati AI Bot — Scan Log
Persiste o estado do último scan por símbolo em `scan_state.json`
para o dashboard exibir o que está sendo analisado em tempo real.
"""

import json
import threading
from datetime import datetime
from pathlib import Path
from typing import Optional

SCAN_FILE = Path("scan_state.json")
_lock = threading.Lock()


def _read() -> dict:
    if not SCAN_FILE.exists():
        return {"cycle": 0, "started_at": None, "symbols": {}}
    try:
        return json.loads(SCAN_FILE.read_text(encoding="utf-8"))
    except Exception:
        return {"cycle": 0, "started_at": None, "symbols": {}}


def _write(data: dict) -> None:
    try:
        SCAN_FILE.write_text(json.dumps(data, indent=2, default=str), encoding="utf-8")
    except Exception:
        pass


def start_cycle() -> int:
    """Marca o início de um novo ciclo de varredura."""
    with _lock:
        data = _read()
        data["cycle"] = int(data.get("cycle", 0)) + 1
        data["started_at"] = datetime.now().isoformat(timespec="seconds")
        _write(data)
        return data["cycle"]


def record(
    symbol: str,
    *,
    status: str,
    direction: Optional[str] = None,
    score: Optional[int] = None,
    price: Optional[float] = None,
    rsi: Optional[float] = None,
    volume_ratio: Optional[float] = None,
    trend: Optional[str] = None,
    htf_trend: Optional[str] = None,
    in_discount: Optional[bool] = None,
    in_premium: Optional[bool] = None,
    reason: str = "",
) -> None:
    """Registra o resultado da análise de um símbolo no ciclo atual.

    `status` ∈ {"ok", "no_signal", "low_score", "executed", "error", "no_data"}
    """
    with _lock:
        data = _read()
        data.setdefault("symbols", {})[symbol] = {
            "symbol": symbol,
            "status": status,
            "direction": direction,
            "score": score,
            "price": price,
            "rsi": round(rsi, 2) if isinstance(rsi, (int, float)) else None,
            "volume_ratio": round(volume_ratio, 2) if isinstance(volume_ratio, (int, float)) else None,
            "trend": trend,
            "htf_trend": htf_trend,
            "in_discount": in_discount,
            "in_premium": in_premium,
            "reason": reason,
            "updated_at": datetime.now().isoformat(timespec="seconds"),
        }
        _write(data)


def snapshot() -> dict:
    return _read()
