# apps/aroflo_connector_app/agent/pending_store.py
from __future__ import annotations

import json
import os
import time
import secrets
from typing import Any, Dict, Optional

DEFAULT_PATH = os.getenv("AROFLO_AGENT_PENDING_PATH", "/tmp/aroflo_agent_pending.json")
DEFAULT_TTL_SECONDS = int(os.getenv("AROFLO_AGENT_PENDING_TTL_SECONDS", "900"))  # 15 min


def _now() -> int:
    return int(time.time())


def load_pending(path: str = DEFAULT_PATH) -> Optional[Dict[str, Any]]:
    try:
        if not os.path.exists(path):
            return None
        with open(path, "r", encoding="utf-8") as f:
            data = json.load(f)
        # expiración
        expires_at = int(data.get("expires_at", 0))
        if expires_at and _now() > expires_at:
            try:
                os.remove(path)
            except Exception:
                pass
            return None
        return data
    except Exception:
        return None


def clear_pending(path: str = DEFAULT_PATH) -> None:
    try:
        if os.path.exists(path):
            os.remove(path)
    except Exception:
        pass


def save_pending(payload: Dict[str, Any], path: str = DEFAULT_PATH, ttl_seconds: int = DEFAULT_TTL_SECONDS) -> Dict[str, Any]:
    token = secrets.token_urlsafe(16)
    data = {
        "token": token,
        "created_at": _now(),
        "expires_at": _now() + ttl_seconds,
        "payload": payload,
    }
    with open(path, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    return data


def match_token(token: str, pending: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
    if not pending:
        return None
    if (pending.get("token") or "") == (token or ""):
        return pending
    return None
