"""
Analytics API Routes
"""
from fastapi import APIRouter, HTTPException, Query
from typing import List, Dict, Any, Optional
from pydantic import BaseModel
from datetime import datetime

from app.services.analytics_service import analytics_service

router = APIRouter()


class ConversationData(BaseModel):
    id: int
    status: str = "active"
    message_count: int = 0
    first_response_time: Optional[float] = None
    duration_seconds: Optional[float] = None
    satisfaction_score: Optional[float] = None
    channel: str = "web"


class KPIRequest(BaseModel):
    conversations: List[ConversationData]
    period_days: int = 30


class TrendRequest(BaseModel):
    data: List[Dict[str, Any]]
    metric: str = "count"
    granularity: str = "daily"


class UserSessionData(BaseModel):
    user_id: Optional[str] = None
    hour: Optional[int] = None
    day_of_week: Optional[int] = None
    duration_seconds: Optional[float] = None
    message_count: int = 0


class BehaviorRequest(BaseModel):
    sessions: List[UserSessionData]


class TopicRequest(BaseModel):
    conversations: List[Dict[str, Any]]


class InsightsRequest(BaseModel):
    kpis: Dict[str, Any]
    trends: Dict[str, Any]


@router.post("/kpis", summary="Calculate KPIs")
async def calculate_kpis(request: KPIRequest):
    """
    Calculate key performance indicators from conversation data
    """
    conversations = [conv.dict() for conv in request.conversations]
    result = await analytics_service.calculate_kpis(
        conversations,
        request.period_days
    )
    return result


@router.post("/trends", summary="Analyze trends")
async def analyze_trends(request: TrendRequest):
    """
    Analyze trends in time series data
    """
    result = await analytics_service.get_trends(
        request.data,
        request.metric,
        request.granularity
    )
    return result


@router.post("/behavior", summary="Analyze user behavior")
async def analyze_behavior(request: BehaviorRequest):
    """
    Analyze user behavior patterns
    """
    sessions = [s.dict() for s in request.sessions]
    result = await analytics_service.analyze_user_behavior(sessions)
    return result


@router.post("/topics", summary="Analyze conversation topics")
async def analyze_topics(request: TopicRequest):
    """
    Extract and analyze conversation topics
    """
    result = await analytics_service.get_topic_analysis(request.conversations)
    return result


@router.post("/insights", summary="Generate insights")
async def generate_insights(request: InsightsRequest):
    """
    Generate actionable insights from KPIs and trends
    """
    result = await analytics_service.generate_insights(
        request.kpis,
        request.trends
    )
    return {"insights": result}


@router.get("/dashboard/{client_id}", summary="Get dashboard data")
async def get_dashboard_data(
    client_id: int,
    period: str = Query("30d", description="Period: 7d, 30d, 90d")
):
    """
    Get aggregated dashboard data for a client
    """
    # In production, this would fetch from database
    # For now, return sample data
    period_days = int(period.replace('d', ''))

    return {
        "client_id": client_id,
        "period": period,
        "summary": {
            "total_conversations": 2847,
            "total_messages": 12456,
            "unique_users": 1234,
            "resolution_rate": 87.5,
            "avg_response_time": 1.2
        },
        "trends": {
            "conversations": "increasing",
            "messages": "stable",
            "users": "increasing"
        },
        "top_topics": [
            {"topic": "pricing", "count": 456},
            {"topic": "support", "count": 342},
            {"topic": "features", "count": 287}
        ]
    }
