"""
api/guest.py - Guest user management endpoints
"""

from fastapi import APIRouter, Depends, HTTPException
from typing_extensions import Annotated
from io import BytesIO
import pandas as pd
from fastapi.responses import StreamingResponse

from core.security.authentication import get_user
from schema import GenericResponse
from schema.user import GuestListRequest, GuestSearchRequest
from services.guest import GuestService
from models import User

guest_router = APIRouter(prefix="/guest")


@guest_router.get("/all", response_model=GenericResponse)
async def get_all_guests(
    user=Depends(get_user), 
    service: GuestService = Depends(GuestService)
):
    """Get all guest users - simple version"""
    data = service.get_all_guests()
    return {"message": "Guest data populated successfully", "data": data}


@guest_router.post("/list", response_model=GenericResponse)
async def list_guests(
    request: GuestListRequest,
    user=Depends(get_user),
    service: GuestService = Depends(GuestService)
):
    """
    List all guest users with optional filters.
    
    Optional filters:
    - email: Filter by email (partial match)
    - first_name: Filter by first name
    - last_name: Filter by last name
    - mobile_number: Filter by mobile number
    - is_active: Filter by active status
    - fields: Specify which fields to return
    """
    result = service.list_all_guests(request, user)
    return {
        "message": f"Found {result['total_results']} guest(s)",
        "data": result
    }


@guest_router.post("/search", response_model=GenericResponse)
async def search_guests(
    request: GuestSearchRequest,
    user=Depends(get_user),
    service: GuestService = Depends(GuestService)
):
    """
    Search guest users by name, email, or phone number.
    
    Searches across:
    - First name
    - Last name
    - Full name
    - Email
    - Mobile number
    """
    result = service.search_guests(request, user)
    return {
        "message": f"Found {result['total_results']} guest(s)",
        "data": result
    }


@guest_router.post("/list/export")
async def export_guests(
    request: GuestListRequest,
    user=Depends(get_user),
    service: GuestService = Depends(GuestService)
):
    """Export guest list to Excel file"""
    result = service.list_all_guests(request, user)
    
    if len(result["data"]) == 0:
        raise HTTPException(status_code=404, detail="No guests found")
    
    # Create Excel file
    df = pd.DataFrame(result["data"])
    output = BytesIO()
    
    with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
        df.to_excel(writer, index=False, sheet_name='Guests')
        
        # Auto-adjust column width
        workbook = writer.book
        worksheet = writer.sheets['Guests']
        
        for i, col in enumerate(df.columns):
            max_len = max(df[col].astype(str).apply(len).max(), len(col)) + 2
            worksheet.set_column(i, i, min(max_len, 50))
    
    output.seek(0)
    
    return StreamingResponse(
        output,
        media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        headers={"Content-Disposition": "attachment; filename=guest_list.xlsx"}
    )