"""
AkDevz AI Market Intelligence — Data Normalizer
Transforms raw FYERS API records into standardized time-series structures.
"""
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
from typing import List, Dict, Any
import numpy as np

IST = ZoneInfo("Asia/Kolkata")

class DataNormalizer:
    @staticmethod
    def epoch_to_ist_str(epoch: int) -> str:
        dt = datetime.fromtimestamp(epoch, tz=timezone.utc).astimezone(IST)
        return dt.strftime("%Y-%m-%d %H:%M:%S")

    @staticmethod
    def normalize_candles(raw_candles: List[List[Any]]) -> List[Dict[str, Any]]:
        normalized = []
        for bar in raw_candles:
            epoch = int(bar[0])
            item = {
                "epoch": epoch,
                "datetime_ist": DataNormalizer.epoch_to_ist_str(epoch),
                "open": float(bar[1]),
                "high": float(bar[2]),
                "low": float(bar[3]),
                "close": float(bar[4]),
                "volume": int(bar[5]) if len(bar) > 5 else 0,
                "oi": int(bar[6]) if len(bar) > 6 else 0,
            }
            normalized.append(item)
        return normalized

    @staticmethod
    def to_numpy_arrays(candles: List[Dict[str, Any]]) -> Dict[str, np.ndarray]:
        if not candles:
            return {
                "epoch": np.array([]),
                "open": np.array([]),
                "high": np.array([]),
                "low": np.array([]),
                "close": np.array([]),
                "volume": np.array([]),
                "oi": np.array([]),
            }

        return {
            "epoch": np.array([c["epoch"] for c in candles], dtype=np.int64),
            "open": np.array([c["open"] for c in candles], dtype=np.float64),
            "high": np.array([c["high"] for c in candles], dtype=np.float64),
            "low": np.array([c["low"] for c in candles], dtype=np.float64),
            "close": np.array([c["close"] for c in candles], dtype=np.float64),
            "volume": np.array([c["volume"] for c in candles], dtype=np.float64),
            "oi": np.array([c["oi"] for c in candles], dtype=np.float64),
        }
