from fastapi import APIRouter, Depends
from typing import Union
import structlog

from .models.requests import TranslationRequest, BatchTranslationRequest
from .models.responses import (
    TranslationResponse,
    AllergensOnlyResponse,
    MenuOnlyResponse,
    BatchTranslationResponse,
    BatchAllergensOnlyResponse,
    BatchMenuOnlyResponse
)
from ...shared.middleware.auth import verify_translation_auth

router = APIRouter(tags=["translation"])
logger = structlog.get_logger("translation.routes")

# Service instance will be set by main.py
translation_service = None


def set_translation_service(service):
    """Set the translation service instance"""
    global translation_service
    translation_service = service


@router.post(
    "/translate-menu-item",
    response_model=Union[TranslationResponse, AllergensOnlyResponse, MenuOnlyResponse],
    dependencies=[Depends(verify_translation_auth)]
)
async def translate_menu_item(request: TranslationRequest):
    """
    Translate a single menu item

    BACKWARD COMPATIBLE - Maintains exact same input/output format
    """
    logger.info(
        "translate_menu_item_request",
        has_menu=bool(request.menuItem),
        has_description=bool(request.description),
        type=request.type,
        allergens_only=request.allergensOnly,
        english_included=request.englishIncluded
    )

    result = await translation_service.translate_single_item(request)

    logger.info("translate_menu_item_response", type=type(result).__name__)
    return result


@router.post(
    "/translate-menu-items",
    response_model=Union[
        BatchTranslationResponse,
        BatchAllergensOnlyResponse,
        BatchMenuOnlyResponse
    ],
    dependencies=[Depends(verify_translation_auth)]
)
async def translate_menu_items(request: BatchTranslationRequest):
    """
    Translate multiple menu items

    BACKWARD COMPATIBLE - Maintains exact same input/output format
    """
    logger.info(
        "translate_menu_items_request",
        count=len(request.menu_items),
        language=request.language_from,
        type=request.type,
        allergens_only=request.allergensOnly,
        english_included=request.englishIncluded
    )

    result = await translation_service.translate_batch(request)

    logger.info("translate_menu_items_response", count=len(result.items))
    return result
