# Import the ResponseModel
from typing import Dict, List, Optional

from fastapi import APIRouter, Depends
from fastapi import File as FastAPIFile
from fastapi import Query, UploadFile
from sqlalchemy.orm import Session
from starlette import status
from starlette.requests import Request

from src.apps.base.schemas.response_model import ResponseModel
from src.apps.keyword_generator.schemas.keyword_generator import KeywordSave
from src.apps.keyword_generator.services.keyword_generator import (
    check_addition_matched as check_addition_matched_service,
)
from src.apps.keyword_generator.services.keyword_generator import (
    save_keywords_to_db as save_service,
)
from src.apps.keyword_generator.services.keyword_generator import (
    upload_for_keyword_generator as upload_service,
)
from src.apps.keyword_generator.services.keyword_generator import upload_wines_addition
from src.apps.user.models.user_model import Users
from src.core.dependencies import get_db
from src.core.exceptions import APIException
from src.utils.guard import AuthGuard, get_current_user

router = APIRouter()


@router.post(
    "/upload_for_keyword_generator",
    response_model=ResponseModel,
    status_code=status.HTTP_201_CREATED,
)
async def upload_for_keyword_generator(
    file: UploadFile = FastAPIFile(..., description="File to upload"), db: Session = Depends(get_db)
):
    # Example: get uploaded file from request
    if not file:
        raise APIException(
            module=__name__,
            error={},
            status_code=status.HTTP_400_BAD_REQUEST,
            message="Please select file to upload.",
        )
    # Process the file (implement your logic here)
    data = await upload_service(db, file)
    # For demonstration, just return filename
    return ResponseModel(success=True, message="File uploaded successfully.", data=data)


@router.post(
    "/save_keywords_to_db",
    response_model=ResponseModel,
    status_code=status.HTTP_201_CREATED,
)
async def save_keywords_to_db(keywords: List[KeywordSave], db: Session = Depends(get_db)):
    # Call your service to save
    result = await save_service(db=db, keywords=keywords)
    return ResponseModel(success=True, message="Keywords saved successfully.", data=result)


@router.post(
    "/upload-wines-addition",
    response_model=ResponseModel,
    status_code=status.HTTP_201_CREATED,
)
async def upload_for_wine_addition(
    file: UploadFile = FastAPIFile(..., description="File to upload"), db: Session = Depends(get_db)
):
    # Example: get uploaded file from request
    if not file:
        raise APIException(
            module=__name__,
            error={},
            status_code=status.HTTP_400_BAD_REQUEST,
            message="Please select file to upload.",
        )
    # Process the file (implement your logic here)
    data = await upload_wines_addition(db, file)
    # For demonstration, just return filename
    return ResponseModel(success=True, message="File uploaded successfully.", data=data)


@router.get(
    "/check-addition-matched",
    response_model=ResponseModel,
)
def check_addition_matched(literal: Optional[str] = Query(None), db: Session = Depends(get_db)):
    """
    Check if the addition is matched in the database.
    """

    # Fetch the addition from the database
    data = check_addition_matched_service(db, literal)

    return ResponseModel(success=True, message="Addition found.", data=data)
