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

from app.services.forecast_service import forecast_service

router = APIRouter()


class HistoricalData(BaseModel):
    date: str
    count: int = 0
    revenue: float = 0.0


class ForecastRequest(BaseModel):
    historical_data: List[HistoricalData]
    periods: int = 30


class AnomalyRequest(BaseModel):
    data: List[Dict[str, Any]]
    threshold: float = 2.0


@router.post("/messages", summary="Forecast message volume")
async def forecast_messages(request: ForecastRequest):
    """
    Forecast future message volume based on historical data
    """
    data = [{"date": d.date, "count": d.count} for d in request.historical_data]
    result = await forecast_service.forecast_messages(data, request.periods)
    return result


@router.post("/revenue", summary="Forecast revenue")
async def forecast_revenue(request: ForecastRequest):
    """
    Forecast future revenue based on historical data
    """
    data = [{"date": d.date, "revenue": d.revenue} for d in request.historical_data]
    result = await forecast_service.forecast_revenue(data, request.periods)
    return result


@router.post("/anomalies", summary="Detect anomalies")
async def detect_anomalies(request: AnomalyRequest):
    """
    Detect anomalies in time series data
    """
    result = await forecast_service.detect_anomalies(
        request.data,
        request.threshold
    )
    return result


@router.get("/sample", summary="Get sample forecast")
async def get_sample_forecast(
    periods: int = Query(14, description="Number of days to forecast")
):
    """
    Get a sample forecast with demo data
    """
    # Sample historical data
    from datetime import datetime, timedelta
    import random

    base_date = datetime.now() - timedelta(days=30)
    historical_data = []

    for i in range(30):
        date = base_date + timedelta(days=i)
        # Add some pattern
        base_count = 100
        weekly_pattern = 20 if date.weekday() < 5 else -30
        random_noise = random.randint(-15, 15)
        trend = i * 2

        count = max(0, base_count + weekly_pattern + random_noise + trend)
        historical_data.append({
            "date": date.strftime("%Y-%m-%d"),
            "count": count
        })

    result = await forecast_service.forecast_messages(historical_data, periods)
    result["historical_data"] = historical_data

    return result
