"""
AkDevz AI Market Intelligence — FYERS Instrument Master Sync
Downloads, parses, and validates official FYERS symbol master CSVs.
"""
import csv
import io
import httpx
from pathlib import Path
from typing import Dict, List, Optional
from python.config.settings import BASE_DIR

CACHE_DIR = BASE_DIR / "storage" / "cache" / "instruments"
CACHE_DIR.mkdir(parents=True, exist_ok=True)

class InstrumentMaster:
    URLS = {
        "NSE_CM": "https://public.fyers.in/sym_details/NSE_CM.csv",
        "NSE_FO": "https://public.fyers.in/sym_details/NSE_FO.csv",
        "NSE_CD": "https://public.fyers.in/sym_details/NSE_CD.csv",
        "BSE_CM": "https://public.fyers.in/sym_details/BSE_CM.csv",
        "BSE_FO": "https://public.fyers.in/sym_details/BSE_FO.csv",
    }

    def __init__(self):
        self.instruments: Dict[str, dict] = {}

    def sync_segment(self, segment: str = "NSE_FO") -> int:
        if segment not in self.URLS:
            raise ValueError(f"Unknown segment: {segment}")

        url = self.URLS[segment]
        headers = {"User-Agent": "AkDevz-Market-Intelligence/1.0"}

        with httpx.Client(timeout=30.0) as client:
            resp = client.get(url, headers=headers)
            if resp.status_code != 200:
                raise RuntimeError(f"Failed to fetch {segment} CSV: HTTP {resp.status_code}")

            content = resp.text
            # Cache locally
            cache_file = CACHE_DIR / f"{segment}.csv"
            cache_file.write_text(content, encoding="utf-8")

            return self.load_from_csv(content, segment)

    def load_from_csv(self, csv_text: str, segment: str) -> int:
        reader = csv.reader(io.StringIO(csv_text))
        count = 0
        for row in reader:
            if not row or len(row) < 5:
                continue
            # Typical format: FyToken, Symbol, OptionType, Strike, LotSize, etc.
            fytoken = row[0].strip()
            symbol = row[1].strip() if len(row) > 1 else ""
            if not symbol:
                continue

            self.instruments[symbol] = {
                "fytoken": fytoken,
                "symbol": symbol,
                "segment": segment,
                "raw": row
            }
            count += 1
        return count

    def is_symbol_valid(self, symbol: str) -> bool:
        return symbol in self.instruments

    def get_instrument(self, symbol: str) -> Optional[dict]:
        return self.instruments.get(symbol)

instrument_master = InstrumentMaster()
