from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from typing import Dict, Any, Optional
from src.utils.db import get_db
from src.apps.auth.controller import get_current_user
from src.apps.users.models import User
from src.apps.sentiment.controller import get_word_sentiment_analysis, get_topic_sentiment_analysis, fetch_rating_details, fetch_feedback_summary, fetch_all_reviews_by_date, compare_sentiments

sentiment_router = APIRouter()

@sentiment_router.get("/word_sentiment", response_model=Dict[str, Any])
def fetch_word_sentiment(
    branch_id: int,
    source: Optional[str] = Query(None, description="Filter by feedback source"),
    start_date: Optional[str] = Query(None, description="Start date in YYYY-MM-DD format"),
    end_date: Optional[str] = Query(None, description="End date in YYYY-MM-DD format"),
    min_rating: Optional[int] = None, 
    max_rating: Optional[int] = None,
    page: int = Query(1, description="Page number (starts from 1)", ge=1),
    page_size: int = Query(10, description="Number of records per page", ge=1, le=100),
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    API route to fetch word sentiment analysis with pagination.
    Calls controller function for data processing.
    """
    return get_word_sentiment_analysis(
        branch_id, db, current_user, source, start_date, end_date, min_rating, max_rating, page, page_size
    )


@sentiment_router.get("/topic_sentiment", response_model=Dict[str, Any])
def fetch_topic_sentiment(
    branch_id: int,
    source: Optional[str] = Query(None, description="Filter by feedback source"),
    start_date: Optional[str] = Query(None, description="Start date in YYYY-MM-DD format"),
    end_date: Optional[str] = Query(None, description="End date in YYYY-MM-DD format"),
    min_rating: Optional[int] = None, 
    max_rating: Optional[int] = None,
    page: int = Query(1, description="Page number (starts from 1)", ge=1),
    page_size: int = Query(10, description="Number of records per page", ge=1, le=100),
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    API route to fetch topic sentiment analysis with pagination.
    Calls controller function for data processing.
    """
    return get_topic_sentiment_analysis(
        branch_id, db, current_user, source, start_date, end_date, min_rating, max_rating, page, page_size
    )


@sentiment_router.get("/rating_details", response_model=Dict[str, Any])
def get_rating_details_results(
    branch_id: int,
    source: Optional[str] = Query(None, description="Filter by feedback source"),
    start_date: Optional[str] = Query(None, description="Start date in YYYY-MM-DD format"),
    end_date: Optional[str] = Query(None, description="End date in YYYY-MM-DD format"),
    min_rating: Optional[int] = None, 
    max_rating: Optional[int] = None,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    API route to fetch sentiment analysis results (Protected).
    - Ensures the branch belongs to the logged-in user.
    - Allows filtering by source and date range.
    """
    return fetch_rating_details(branch_id, db, current_user, source, start_date, end_date,min_rating, max_rating)


@sentiment_router.get("/review_summary", response_model=Dict[str, Any])
def get_review_summary_results(
    branch_id: int,
    source: Optional[str] = Query(None, description="Filter by feedback source"),
    start_date: Optional[str] = Query(None, description="Start date in YYYY-MM-DD format"),
    end_date: Optional[str] = Query(None, description="End date in YYYY-MM-DD format"),
    min_rating: Optional[int] = None, 
    max_rating: Optional[int] = None,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    API route to fetch sentiment analysis results (Protected).
    - Ensures the branch belongs to the logged-in user.
    """
    return fetch_feedback_summary(branch_id, db, current_user, source, start_date, end_date,min_rating, max_rating)  


@sentiment_router.get("/review_details", response_model=Dict[str, Any])
def get_detailed_review_results(
    branch_id: int,
    source: Optional[str] = Query(None, description="Filter by feedback source"),
    start_date: Optional[str] = Query(None, description="Start date in YYYY-MM-DD format"),
    end_date: Optional[str] = Query(None, description="End date in YYYY-MM-DD format"),
    min_rating: Optional[int] = None, 
    max_rating: Optional[int] = None,
    page: int = Query(1, description="Page number (starts from 1)", ge=1),
    page_size: int = Query(10, description="Number of records per page", ge=1, le=100),
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    API route to fetch sentiment analysis results (Protected).
    - Ensures the branch belongs to the logged-in user.
    """
    return fetch_all_reviews_by_date(branch_id, db, current_user, source, start_date, end_date,min_rating, max_rating, page, page_size)  


@sentiment_router.get("/sentiment/comparison")
async def sentiment_comparison(
    branch_id: int, 
    comparison_frequency: str, 
    source: Optional[str] = None,  
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    API to compare sentiment counts:
    - Yearly: Compares this year vs last year (grouped monthly).
    - Monthly: Compares this month vs last month (grouped by the same date).
    - Optional: Filter by feedback source.
    """
    return compare_sentiments(db, branch_id, comparison_frequency, current_user, source)


