from fastapi import APIRouter, Depends, HTTPException
from typing import List

from core.security.authentication import require_role, get_user
from schema import GenericResponse
from schema.gift_card import (
    GiftCardCreate, 
    GiftCardUpdate, 
    GiftCardAddToWalletRequest,
   
)
from services.gift_card import GiftCardService

router = APIRouter(prefix="/gift_card")

@router.post("/")
async def create_gift_card(request: GiftCardCreate, user=Depends(get_user), service=Depends(GiftCardService)):
    service.save(request)
    return {"message": "Gift card created successfully."}

@router.get("/", )
async def get_all_gift_cards(user=Depends(get_user), service=Depends(GiftCardService)):
    return {"message": "Gift cards populated successfully.", 'data': service.get_all_gift_cards()}

@router.get("/{gift_card_id}", response_model=GenericResponse)
async def get_gift_card(gift_card_id: int, user=Depends(get_user), service=Depends(GiftCardService)):
    gift_card = service.get_gift_card_by_id(gift_card_id)
    if not gift_card:
        raise HTTPException(status_code=404, detail="Gift card not found")
    return {"message": "Gift card populated successfully.", 'data': gift_card}

@router.put("/{gift_card_id}")
async def update_gift_card(gift_card_id: int, request: GiftCardUpdate, user=Depends(get_user), service=Depends(GiftCardService)):
    updated_gift_card = service.update_gift_card(gift_card_id, request)
    if not updated_gift_card:
        raise HTTPException(status_code=404, detail="Gift card not found")
    return {"message": "Gift card updated successfully."}

@router.delete("/{gift_card_id}")
async def delete_gift_card(gift_card_id: int, user=Depends(get_user), service=Depends(GiftCardService)):
    success = service.delete_gift_card(gift_card_id)
    if not success:
        raise HTTPException(status_code=400, detail="Cannot delete gift card - it may be already used or not found")
    return {"message": "Gift card deleted successfully."}

@router.post("/validate")
async def validate_gift_card(code: str, service=Depends(GiftCardService)):
    result = service.validate_gift_card(code)
    return {"message": "Gift card validation completed.", 'data': result}

@router.post("/add-to-wallet")
async def add_gift_card_to_wallet(request: GiftCardAddToWalletRequest, user=Depends(get_user), service=Depends(GiftCardService)):
    result = service.add_to_wallet(request.gift_card_code, user)
    return {"message": result["message"], 'data': result}