"Payments router"
import logging
import os

import pydantic
import stripe
from fastapi import APIRouter, HTTPException

from models.payments import StripeInvoice

payments = APIRouter(
    prefix="/payments",
    tags=["payments"],
    responses={404: {"description": "Not found"}},
    dependencies=[],
)


@payments.get("/invoices")
async def get_invoices(
    stripe_customer_id: str,
    limit: int | None = 10,
    starting_after: str | None = None,
    status: str | None = None,
):
    "Getting Stripe Invoices for team"
    try:
        stripe.api_key = os.getenv("STRIPE_API_KEY")

        query_params = {
            "customer": stripe_customer_id,
            "limit": limit,
            "status": status,
        }

        if starting_after and starting_after.strip():
            query_params["starting_after"] = starting_after

        invoices = stripe.Invoice.list(**query_params)

        formatted_invoices = []
        for invoice in invoices.data:
            formatted_invoice = StripeInvoice(
                id=invoice.id,
                amount_due=invoice.amount_due / 100.0,
                amount_paid=invoice.amount_paid / 100.0,
                amount_remaining=invoice.amount_remaining / 100.0,
                currency=invoice.currency,
                customer=invoice.customer,
                status=invoice.status,
                created=invoice.created,
                due_date=invoice.due_date,
                invoice_pdf=invoice.invoice_pdf,
                hosted_invoice_url=invoice.hosted_invoice_url,
                number=invoice.number,
                paid=invoice.paid,
                period_start=invoice.period_start,
                period_end=invoice.period_end,
                subscription=invoice.subscription,
            )
            formatted_invoices.append(formatted_invoice)

        return {"invoices": formatted_invoices, "has_more": invoices.has_more}

    except stripe.error.StripeError as e:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST, detail=f"Stripe error: {str(e)}"
        ) from e
    except Exception as e:
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Failed to retrieve invoices: {str(e)}",
        ) from e
