"""
Serviço central de calibração: perfil ativo e aplicação de correções.
Um único ponto no FastChecker II 3.0; todos os módulos de medida usam este serviço.
"""
from typing import Dict, Optional, Any

from .calibration_profile import get_correction_at_freq

_active_profile: Optional[Dict[str, Any]] = None
# Último atenuador_db visto num perfil carregado (mantido após clear_active_calibration)
# para o Threshold usar a mesma cadeia física em testes "sem cal" quando o campo está vazio.
_last_loaded_profile_attenuator_db: Optional[float] = None


def set_active_profile(profile: Optional[Dict[str, Any]]) -> None:
    """Define o perfil de calibração ativo (um por vez). None = sem calibração."""
    global _active_profile, _last_loaded_profile_attenuator_db
    _active_profile = profile
    if profile is not None:
        adb = profile.get("attenuator_db")
        if adb is not None and adb != "":
            try:
                _last_loaded_profile_attenuator_db = float(adb)
            except (TypeError, ValueError):
                pass


def get_last_loaded_profile_attenuator_db() -> Optional[float]:
    """Atenuador (dB) do último perfil carregado, ou None se nunca houve perfil com este campo."""
    return _last_loaded_profile_attenuator_db


def get_active_profile() -> Optional[Dict[str, Any]]:
    """Retorna o perfil de calibração ativo ou None."""
    return _active_profile


def has_active_calibration() -> bool:
    """Indica se há calibração ativa no sistema."""
    return _active_profile is not None


def get_correction_forward_dbm(freq_mhz: float) -> float:
    """
    Retorna a correção em dB a ser somada ao Power on Tag Forward na frequência dada.
    Retorna 0.0 se não houver perfil ativo.
    """
    if _active_profile is None:
        return 0.0
    c_fwd, _ = get_correction_at_freq(_active_profile, freq_mhz)
    return c_fwd


def get_correction_reverse_dbm(freq_mhz: float) -> float:
    """
    Retorna a correção em dB a ser somada ao Power on Tag Reverse na frequência dada.
    Retorna 0.0 se não houver perfil ativo.
    """
    if _active_profile is None:
        return 0.0
    _, c_rev = get_correction_at_freq(_active_profile, freq_mhz)
    return c_rev


def clear_active_calibration() -> None:
    """Remove o perfil ativo (medições passam a ser sem correção de calibração)."""
    set_active_profile(None)
