"""
Utility functions for Karishye AI.

This module contains:
- Puja state management functions (get/save user puja state)
- Phone number validation and saving
- Puja booking utilities (cancellation, completion response)
- Knowledge base helpers
"""

import logging
from datetime import datetime
from typing import Dict, Any
from app.agents.agents import general_agent, ChatContext
from app.utils.puja_session_utils import (
    create_puja_session,
    get_puja_session,
    update_puja_session,
    puja_session_to_dict,
    save_user_phone_number as save_phone_to_db,
    validate_indian_phone_number
)

logger = logging.getLogger(__name__)


# ============================================================================
# PUJA STATE MANAGEMENT
# ============================================================================

def get_user_puja_state(user_id: str, puja_type: str, session_id: str) -> dict:
    """
    Get puja session state from database.
    Returns dict for backward compatibility with existing code.
    Session ID is required - no default fallback.
    """
    puja_session = get_puja_session(user_id, session_id, puja_type)
    
    if puja_session:
        # Convert SQLModel object to dict for backward compatibility
        return puja_session_to_dict(puja_session)
    
    # Return default state if not found
    return {
        "puja_type": puja_type,
        "current_question": 0,
        "collected_info": {},
        "completed": False
    }


def save_user_puja_state(user_id: str, puja_type: str, state: dict, session_id: str):
    """
    Save puja session state to database.
    Accepts dict for backward compatibility with existing code.
    Session ID is required - no default fallback.
    """
    # Extract only fields that exist in UserPujaSession schema
    VALID_FIELDS = {
        'collected_info', 'awaiting_phone', 'phone_collected', 
        'completed', 'current_question', 'kb_checked', 'invalid_attempts'
    }
    
    filtered_state = {k: v for k, v in state.items() if k in VALID_FIELDS}
    
    # Check if session exists
    existing_session = get_puja_session(user_id, session_id, puja_type)
    
    if existing_session:
        # Update existing session
        update_puja_session(
            user_id=user_id,
            session_id=session_id,
            puja_type=puja_type,
            updates=filtered_state
        )
    else:
        # Create new session - need to pass the state fields properly
        puja_name = state.get("puja_name", puja_type)
        
        # Create the session first
        new_session = create_puja_session(
            user_id=user_id,
            session_id=session_id,
            puja_type=puja_type,
            puja_name=puja_name
        )
        
        # Then update with filtered state fields
        if new_session:
            update_puja_session(
                user_id=user_id,
                session_id=session_id,
                puja_type=puja_type,
                updates=filtered_state
            )


# ============================================================================
# PHONE NUMBER MANAGEMENT
# ============================================================================

def save_user_phone_number(user_id: str, phone_number: str, puja_type: str, session_id: str):
    """
    Save user's phone number to database (NOT sent to AI).
    """
    try:
        save_phone_to_db(user_id, session_id, phone_number, puja_type)
        return True
    except Exception as e:
        logger.error(f"[DB] Failed to save phone: {type(e).__name__}")
        return False


# ============================================================================
# PUJA BOOKING UTILITIES
# ============================================================================

def cancel_puja_collection(user_id: str, puja_type: str, session_id: str):
    """Cancel the ongoing puja collection by marking it as cancelled in the database."""
    logger.info(f"Cancelling puja collection for user {user_id}, puja {puja_type}, session {session_id}")
    
    # Mark the session as cancelled/inactive
    puja_session = get_puja_session(user_id, session_id, puja_type)
    if puja_session:
        update_puja_session(
            user_id=user_id,
            session_id=session_id,
            puja_type=puja_type,
            updates={"completed": True, "awaiting_phone": False}
        )


# ============================================================================
# KNOWLEDGE BASE HELPERS
# ============================================================================

