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

from core.security.authentication import get_user
from schema.discount_coupon import (
    DiscountCouponCreate,
    DiscountCouponUpdate,
    DiscountCouponResponse,
    DiscountCouponValidationResponse
)
from services.discount_coupon import DiscountCouponService

discount_coupon_router = APIRouter(prefix="/discount-coupons")

@discount_coupon_router.post("/", response_model=DiscountCouponResponse)
def create_coupon(
    request: DiscountCouponCreate,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    try:
        return service.create_coupon(request)
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

@discount_coupon_router.get("/", response_model=list[DiscountCouponResponse])
def list_coupons(
    status: Optional[bool] = None,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    return service.list_all(status)

@discount_coupon_router.get("/{coupon_id}", response_model=DiscountCouponResponse)
def get_coupon(
    coupon_id: int,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    try:
        return service.get_by_id(coupon_id)
    except Exception as e:
        raise HTTPException(status_code=404, detail=str(e))

@discount_coupon_router.put("/{coupon_id}", response_model=DiscountCouponResponse)
def update_coupon(
    coupon_id: int,
    request: DiscountCouponUpdate,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    try:
        return service.update_coupon(coupon_id, request)
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

@discount_coupon_router.patch("/{coupon_id}/toggle-status", response_model=DiscountCouponResponse)
def toggle_coupon_status(
    coupon_id: int,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    try:
        service.toggle_status(coupon_id)
        return service.get_by_id(coupon_id)
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

@discount_coupon_router.delete("/{coupon_id}")
def delete_coupon(
    coupon_id: int,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    try:
        return service.delete_coupon(coupon_id)
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

@discount_coupon_router.get("/validate/{code}", response_model=DiscountCouponValidationResponse)
def validate_coupon(
    code: str,
    cart_value: Optional[float] = None,
    current_user: dict = Depends(get_user)
):
    service = DiscountCouponService()
    return service.validate_coupon(code, cart_value,current_user['id'])