"""Payments router — Stripe payment intent creation and webhook."""
from __future__ import annotations

from fastapi import APIRouter, Depends, Header, HTTPException, Request
from pydantic import BaseModel

import stripe

from dependencies import get_current_user_or_401, get_payment_service, get_admin_token
from services.payment_service import PaymentService

router = APIRouter(prefix='/api', tags=['payments'])


class CreateIntentRequest(BaseModel):
    pack: str  # 'starter' | 'studio' | 'agency'


@router.post('/payments/create-intent')
async def create_payment_intent(
    body: CreateIntentRequest,
    user=Depends(get_current_user_or_401),
    service: PaymentService = Depends(get_payment_service),
):
    """Create a Stripe PaymentIntent for the selected credit pack.

    Returns the client_secret needed to confirm payment in the frontend.
    """
    try:
        return service.create_payment_intent(body.pack, user['id'])
    except ValueError as e:
        raise HTTPException(400, str(e))


@router.post('/payments/webhook')
async def stripe_webhook(
    request: Request,
    stripe_signature: str = Header(None, alias='stripe-signature'),
    service: PaymentService = Depends(get_payment_service),
    admin_token: str = Depends(get_admin_token),
):
    """Receive Stripe webhook events.

    Stripe sends payment_intent.succeeded here after a successful payment.
    FastAPI verifies the signature before processing.
    """
    payload = await request.body()
    if not stripe_signature:
        raise HTTPException(400, 'Missing stripe-signature header')

    try:
        await service.handle_webhook(payload, stripe_signature, admin_token)
    except stripe.error.SignatureVerificationError:
        raise HTTPException(400, 'Invalid Stripe webhook signature')

    return {'received': True}
