from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from typing import Optional
from src.core.database import get_db
from src.apps.auth.utils.auth import get_current_merchant, get_current_user
from src.apps.settings import services
from src.apps.settings.schemas.discounts import DiscountCreate, DiscountUpdate, DiscountResponse

router = APIRouter()


@router.get("")
async def list_discounts(
    search: Optional[str] = Query(None),
    is_active: Optional[bool] = Query(None),
    current_merchant=Depends(get_current_merchant),
    db: Session = Depends(get_db),
):
    discounts = services.list_discounts(current_merchant.id, search, is_active, db)
    return [DiscountResponse.model_validate(d) for d in discounts]


@router.post("", response_model=DiscountResponse)
async def create_discount(
    data: DiscountCreate,
    current_merchant=Depends(get_current_merchant),
    current_user=Depends(get_current_user),
    db: Session = Depends(get_db),
):
    d = data.model_dump()
    d["discount_value"] = int(d["discount_value"]) if d.get("discount_value") is not None else None
    discount = services.create_discount(current_merchant.id, current_user.id, d, db)
    db.commit()
    db.refresh(discount)
    return discount


@router.put("/{discount_id}", response_model=DiscountResponse)
async def update_discount(
    discount_id: int,
    data: DiscountUpdate,
    current_merchant=Depends(get_current_merchant),
    db: Session = Depends(get_db),
):
    d = data.model_dump(exclude_none=True)
    if "discount_value" in d and d["discount_value"] is not None:
        d["discount_value"] = int(d["discount_value"])
    discount = services.update_discount(discount_id, current_merchant.id, d, db)
    db.commit()
    db.refresh(discount)
    return discount


@router.delete("/{discount_id}", status_code=204)
async def delete_discount(
    discount_id: int,
    current_merchant=Depends(get_current_merchant),
    db: Session = Depends(get_db),
):
    services.delete_discount(discount_id, current_merchant.id, db)
    db.commit()
