"""EDIT POINT: global configuration and tracked instruments."""
from functools import lru_cache
import json
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", extra="ignore")
    database_url: str
    angel_api_key: str = ""
    angel_client_code: str = ""
    angel_pin: str = ""
    angel_totp_secret: str = ""
    angel_symbol_tokens_json: str = "{}"
    upstox_access_token: str = ""
    upstox_gift_nifty_key: str = ""
    fx_api_key: str = ""
    fx_api_base_url: str = "https://api.fxapi.com/v1/latest"
    live_order_enabled: bool = False
    market_symbols: tuple[str, ...] = ("NIFTY 50", "INDIA VIX")
    fx_pairs: tuple[str, ...] = ("USDINR", "EURINR", "GBPINR", "JPYINR", "USDJPY")

    def angel_instrument(self, symbol: str) -> dict:
        """EDIT POINT: token master mapping is provided via ANGEL_SYMBOL_TOKENS_JSON."""
        try:
            return json.loads(self.angel_symbol_tokens_json)[symbol]
        except (json.JSONDecodeError, KeyError) as exc:
            raise KeyError(f"No Angel token mapping for {symbol}; update ANGEL_SYMBOL_TOKENS_JSON") from exc


@lru_cache
def get_settings() -> Settings:
    return Settings()
