from typing import List

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from src.application.use_cases.delete_merchant_offer import DeleteMerchantOfferUseCase
from src.application.use_cases.list_merchant_offers import ListMerchantOffersUseCase
from src.core.exceptions import NotFoundException
from src.infrastructure.database.connection import get_db
from src.infrastructure.repositories.sql_merchant_offer_repository import SqlMerchantOfferRepository
from src.presentation.api.v1.merchants.offers.schemas import MerchantOfferResponse

router = APIRouter(tags=["Merchant Offers"])


@router.get(
    "/{merchant_id}",
    response_model=List[MerchantOfferResponse],
)
def list_merchant_offers(merchant_id: int, db: Session = Depends(get_db)):
    """List all active offers for a merchant, with audit log per offer."""
    repo = SqlMerchantOfferRepository(db)
    use_case = ListMerchantOffersUseCase(repo=repo)
    offers = use_case.execute(merchant_id)
    return [vars(o) for o in offers]


@router.delete(
    "/{offer_id}",
    status_code=204,
)
def delete_merchant_offer(offer_id: int, db: Session = Depends(get_db)):
    """Soft-delete a merchant offer by ID."""
    repo = SqlMerchantOfferRepository(db)
    use_case = DeleteMerchantOfferUseCase(repo=repo)
    try:
        use_case.execute(offer_id)
    except NotFoundException as exc:
        raise HTTPException(status_code=404, detail=str(exc)) from exc
