"""Cached Simpro job stats (e.g. Bunbury Commercial KPIs)."""
import logging
import time
from typing import Dict, Optional, Tuple

from asgiref.sync import sync_to_async

from app.services.simpro_api_limits import SIMPRO_API_CACHE_TTL_SECONDS
from app.services.simpro_client import SimProClient

logger = logging.getLogger(__name__)

_cache: Dict[str, Tuple[float, dict]] = {}


async def get_job_stats_for_company(
    branch_id: str,
    company_id: int,
    force_refresh: bool = False,
) -> dict:
    """
    Job stats for one Simpro company, cached with SIMPRO_API_CACHE_TTL_SECONDS.
    """
    key = f"{branch_id}:{company_id}"
    now = time.time()
    if not force_refresh and key in _cache:
        ts, data = _cache[key]
        if now - ts < SIMPRO_API_CACHE_TTL_SECONDS:
            return data

    try:
        client = await sync_to_async(SimProClient)(branch_id)
        data = await client.fetch_job_stats_for_company(company_id) or {}
    except Exception as e:
        logger.warning("Simpro job stats fetch failed %s company %s: %s", branch_id, company_id, e)
        data = {}

    _cache[key] = (now, data)
    return data


def invalidate_job_stats_cache(branch_id: Optional[str] = None) -> None:
    if branch_id:
        for k in list(_cache.keys()):
            if k.startswith(f"{branch_id}:"):
                _cache.pop(k, None)
    else:
        _cache.clear()
