from __future__ import annotations

from typing import Optional
from uuid import UUID

from pydantic import BaseModel, Field


class CloudCreditPackagePublic(BaseModel):
    slug: str
    name: str
    description: Optional[str] = None
    credits: int
    price_minor: int
    currency: str
    stripe_ready: bool = False


class CloudCreditCheckoutRequest(BaseModel):
    package_slug: str
    success_url: Optional[str] = None
    cancel_url: Optional[str] = None
    idempotency_key: Optional[str] = Field(default=None, min_length=1, max_length=255)


class CloudWalletSnapshot(BaseModel):
    millicredits: int
    credits: float
    consumed_credits_period: float
    fair_usage: bool
    enforcement_enabled: bool
    cap_credits: Optional[int] = None
    used_pct: Optional[float] = None
    alert_level: Optional[str] = None
    public_serving: bool
    period_metrics: dict[str, float]
    packages: list[CloudCreditPackagePublic]


class CodegenWalletSnapshot(BaseModel):
    included_remaining: int
    topup_remaining: int
    total_available: int
    included_units: int
    consumed_units: int
    used_pct: Optional[float] = None
    alert_level: Optional[str] = None
    has_active_subscription: bool
    plan_slug: Optional[str] = None
    packages: list[dict]


class WorkspaceWalletsResponse(BaseModel):
    workspace_id: UUID
    codegen: CodegenWalletSnapshot
    cloud: CloudWalletSnapshot


class OwnerBypassResponse(BaseModel):
    token: str
    query_param: str = "__p2hs_owner"
