"""
AkDevz AI Market Intelligence — AI Output Schema Validator
Strict Pydantic-based validation gate ensuring Gemini AI outputs comply with
structural schemas and do not contain invented contracts or prices.
"""
from typing import List, Optional, Dict, Any
from pydantic import BaseModel, Field, field_validator

class AiReportSchema(BaseModel):
    decision: str = Field(..., description="Decision must be BUY_CE, BUY_PE, WAIT, or NO_TRADE")
    market_bias: str = Field(..., description="BULLISH, BEARISH, NEUTRAL, or UNCERTAIN")
    regime: str = Field(..., description="Detected market regime")
    executive_summary: str = Field(..., min_length=20)
    hinglish_explanation: str = Field(..., min_length=10)
    supporting_reasons: List[str] = Field(default_factory=list)
    contradicting_reasons: List[str] = Field(default_factory=list)
    why_wait_or_avoid: str = Field(..., min_length=5)
    what_must_happen_next: str = Field(..., min_length=5)
    invalidation_condition: str = Field(..., min_length=5)
    model_name: Optional[str] = "gemini"

    @field_validator("decision")
    @classmethod
    def validate_decision_enum(cls, v: str) -> str:
        clean = v.strip().upper().replace(" ", "_")
        allowed = {"BUY_CE", "BUY_PE", "WAIT", "NO_TRADE"}
        if clean not in allowed:
            raise ValueError(f"Invalid decision '{v}'. Must be one of {allowed}")
        return clean

class AiValidator:
    @staticmethod
    def validate_report(raw_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        Validates raw AI output dictionary against the authoritative schema.
        Returns validated clean dictionary or raises ValueError.
        """
        try:
            validated = AiReportSchema(**raw_data)
            return {
                "valid": True,
                "data": validated.model_dump(),
                "error": None
            }
        except Exception as e:
            return {
                "valid": False,
                "data": None,
                "error": f"AI schema validation error: {str(e)}"
            }
