from typing import Optional
from uuid import UUID

from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session

from src.apps.base.schemas.response_model import ResponseModel
from src.apps.wine.validation.schemas.validation import *
from src.apps.wine.validation.services.validation import (
    get_keyword_matches,
    populate_retailers,
    producer_noise,
    save_matched,
    wine_noise,
)
from src.core.dependencies import get_db
from src.utils import constants
from src.utils.constants import MAX_PER_PAGE

router = APIRouter(prefix="", tags=["Wine Validation"])


@router.get("/populate-retailers", response_model=ResponseModel, summary="Populate Retailers")
async def populate_retailers_endpoint(
    db: Session = Depends(get_db),
    codes: Optional[str] = Query(default=None, description="Comma-separated list of retailer codes"),
):
    """
    Populate Retailers.
    """
    codes = codes.split(",") if codes else None
    retailers = await populate_retailers(db=db, codes=codes)
    return ResponseModel(
        data=retailers, status_code=status.HTTP_200_OK, success=True, message="Retailers populated successfully"
    )


@router.get("/keyword-matches", response_model=ResponseModel, summary="Get Keyword Matches")
async def get_keyword_matches_endpoint(
    db: Session = Depends(get_db),
    retailer_code: str = Query(..., description="Keyword to search for matches"),
    matched_filter: Optional[str] = Query(default=None, description="Retailer code to filter matches"),
    is_narrowed: Optional[bool] = Query(default=False, description="Whether to narrow down the matches"),
    offset: Optional[int] = Query(default=0, ge=0, description="Offset for pagination"),
):
    """
    Get Keyword Matches.
    """
    matches = await get_keyword_matches(
        db=db, retailer_code=retailer_code, matched_filter=matched_filter, is_narrow=is_narrowed, offset=offset
    )
    return ResponseModel(
        data=matches, status_code=status.HTTP_200_OK, success=True, message="Keyword matches fetched successfully"
    )


@router.get("/producer-noise", response_model=ResponseModel, summary="Get Producer Noise")
async def producer_noise_endpoint(
    db: Session = Depends(get_db), producer_id: str = Query(..., description="Retailer code to fetch producer noise")
):
    """
    Get Producer Noise.
    """
    noise = await producer_noise(db=db, producer_id=producer_id)
    return ResponseModel(
        data=noise, status_code=status.HTTP_200_OK, success=True, message="Producer noise fetched successfully"
    )


@router.get("/wine-noise", response_model=ResponseModel, summary="Get Wine Noise")
async def wine_noise_endpoint(
    db: Session = Depends(get_db), wine_db_id: str = Query(..., description="Retailer code to fetch wine noise")
):
    """
    Get Wine Noise.
    """
    noise = await wine_noise(db=db, wine_db_id=wine_db_id)
    return ResponseModel(
        data=noise, status_code=status.HTTP_200_OK, success=True, message="Wine noise fetched successfully"
    )


@router.post("/save-matched", response_model=ResponseModel, summary="Save Matched Wine")
async def save_matched_endpoint(
    payload: SaveMatchedRequest,
    db: Session = Depends(get_db),
):
    """
    Save Matched Wine.
    """
    result = await save_matched(db=db, payload=payload)
    return ResponseModel(
        data=result, status_code=status.HTTP_200_OK, success=True, message="Matched wine saved successfully"
    )
