from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional
from datetime import datetime
from utils.utils import get_db, EventType
from . import handler
from .schema import (
    AnalyticseventCreate,
    AnalyticseventUpdate,
    AnalyticseventResponse,
    PaginatedAnalyticseventResponse,
)

router = APIRouter(prefix="/analytics/events", tags=["Analytics Events"])


@router.post(
    "/",
    response_model=AnalyticseventResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Log Analytics Event",
    description="Creates a new analytics event to track user interactions. Accepts event type, session ID, optional calculation ID, event data, and user agent. Returns 400 if the referenced calculation does not exist.",
)
def create_analyticsevent_route(
    data: AnalyticseventCreate,
    db: Session = Depends(get_db),
):
    return handler.create_analyticsevent(db, data)


@router.get(
    "/{entity_id}",
    response_model=AnalyticseventResponse,
    summary="Get Analytics Event",
    description="Retrieves a single analytics event by ID. Returns 404 if the event does not exist.",
)
def get_analyticsevent_route(
    entity_id: str,
    db: Session = Depends(get_db),
):
    return handler.get_analyticsevent(db, entity_id)


@router.get(
    "/",
    response_model=PaginatedAnalyticseventResponse,
    summary="List Analytics Events",
    description="Returns a paginated list of analytics events. Supports optional filters for session ID, event type, calculation ID, and date range (start_date and end_date). Results are ordered by created_at descending.",
)
def list_analyticsevents_route(
    limit: int = Query(20, ge=1),
    offset: int = Query(0, ge=0),
    session_id: Optional[str] = None,
    event_type: Optional[EventType] = None,
    calculation_id: Optional[str] = None,
    start_date: Optional[datetime] = None,
    end_date: Optional[datetime] = None,
    db: Session = Depends(get_db),
):
    return handler.list_analyticsevents(
        db,
        limit,
        offset,
        session_id=session_id,
        event_type=event_type,
        calculation_id=calculation_id,
        start_date=start_date,
        end_date=end_date,
    )


@router.patch(
    "/{entity_id}",
    response_model=AnalyticseventResponse,
    summary="Update Analytics Event",
    description="Updates an existing analytics event. Only provided fields are updated. Returns 404 if the event does not exist, 400 if no fields are provided or if the referenced calculation does not exist.",
)
def update_analyticsevent_route(
    entity_id: str,
    data: AnalyticseventUpdate,
    db: Session = Depends(get_db),
):
    return handler.update_analyticsevent(db, entity_id, data)


@router.delete(
    "/{entity_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Analytics Event",
    description="Deletes an analytics event by ID. Returns 404 if the event does not exist.",
)
def delete_analyticsevent_route(
    entity_id: str,
    db: Session = Depends(get_db),
):
    return handler.delete_analyticsevent(db, entity_id)