"""
AkDevz AI Market Intelligence — Historical Data Collector
Fetches, checks session boundaries, and normalizes historical candle data
within FYERS Standard entitlements (1 yr intraday, 5 yr daily).
"""
import time
from datetime import datetime, timedelta
from typing import List, Dict, Any, Optional
from zoneinfo import ZoneInfo

from python.fyers.rest_client import FyersRestClient
from python.data.data_validator import DataValidator
from python.data.data_normalizer import DataNormalizer

IST = ZoneInfo("Asia/Kolkata")

class HistoricalCollector:
    RESOLUTION_MAP = {
        "1m": "1",
        "3m": "3",
        "5m": "5",
        "15m": "15",
        "30m": "30",
        "60m": "60",
        "1D": "D",
        "1W": "W",
    }

    def __init__(self, rest_client: Optional[FyersRestClient] = None):
        self.client = rest_client or FyersRestClient()

    def fetch_candles(
        self,
        symbol: str,
        timeframe: str = "5m",
        days_back: int = 5
    ) -> Dict[str, Any]:
        """
        Fetches historical candles for given symbol and timeframe.
        Validates OHLC integrity and returns normalized dataset.
        """
        resolution = self.RESOLUTION_MAP.get(timeframe, "5")
        
        now = datetime.now(IST)
        start_date = now - timedelta(days=days_back)
        
        range_from = start_date.strftime("%Y-%m-%d")
        range_to = now.strftime("%Y-%m-%d")

        try:
            raw_candles = self.client.get_history(
                symbol=symbol,
                resolution=resolution,
                range_from=range_from,
                range_to=range_to,
                cont_flag=1,
                oi_flag=1
            )
        except Exception as e:
            return {
                "success": False,
                "symbol": symbol,
                "timeframe": timeframe,
                "error": str(e),
                "candles": []
            }

        if not raw_candles:
            return {
                "success": True,
                "symbol": symbol,
                "timeframe": timeframe,
                "count": 0,
                "candles": [],
                "validation": "EMPTY_RESULT"
            }

        # Validate candle series
        is_valid, reason = DataValidator.validate_series(raw_candles)
        if not is_valid:
            return {
                "success": False,
                "symbol": symbol,
                "timeframe": timeframe,
                "error": f"Validation failed: {reason}",
                "candles": []
            }

        normalized = DataNormalizer.normalize_candles(raw_candles)
        return {
            "success": True,
            "symbol": symbol,
            "timeframe": timeframe,
            "count": len(normalized),
            "candles": normalized,
            "validation": "PASSED"
        }
