from datetime import datetime from pydantic import BaseModel, EmailStr, Field from app.models.enums import AdminRole, EventStatus, EventType, OrderStatus, TicketTypeStatus class AdminLoginRequest(BaseModel): email: EmailStr password: str = Field(min_length=8, max_length=128) class AdminToken(BaseModel): access_token: str token_type: str = "bearer" class AdminUserPublic(BaseModel): id: int email: EmailStr role: AdminRole model_config = {"from_attributes": True} class DashboardMetrics(BaseModel): total_revenue_paise: int tickets_sold: int tickets_remaining: int orders_total: int orders_paid: int orders_pending: int attendance: int upcoming_events: int class EventStatsRow(BaseModel): event_id: int event_title: str starts_at: datetime tickets_sold: int tickets_remaining: int revenue_paise: int attendance: int class VenueAdmin(BaseModel): id: int slug: str name: str area: str city: str address: str map_url: str | None = None description: str | None = None model_config = {"from_attributes": True} class VenueCreate(BaseModel): slug: str = Field(min_length=2, max_length=120) name: str = Field(min_length=2, max_length=200) area: str = Field(min_length=2, max_length=120) city: str = Field(default="Bengaluru", max_length=80) address: str = Field(min_length=5, max_length=512) map_url: str | None = Field(default=None, max_length=512) description: str | None = None class VenueUpdate(BaseModel): slug: str | None = Field(default=None, max_length=120) name: str | None = Field(default=None, max_length=200) area: str | None = Field(default=None, max_length=120) city: str | None = Field(default=None, max_length=80) address: str | None = Field(default=None, max_length=512) map_url: str | None = Field(default=None, max_length=512) description: str | None = None class EventAdmin(BaseModel): id: int slug: str title: str category: EventType status: EventStatus venue_id: int description: str | None starts_at: datetime ends_at: datetime | None is_featured: bool cover_image_url: str | None cover_image_alt: str | None model_config = {"from_attributes": True} class EventCreate(BaseModel): slug: str = Field(min_length=2, max_length=200) title: str = Field(min_length=2, max_length=240) category: EventType status: EventStatus = EventStatus.draft venue_id: int description: str | None = None starts_at: datetime ends_at: datetime | None = None is_featured: bool = False cover_image_url: str | None = None cover_image_alt: str | None = None class EventUpdate(BaseModel): slug: str | None = Field(default=None, max_length=200) title: str | None = Field(default=None, max_length=240) category: EventType | None = None status: EventStatus | None = None venue_id: int | None = None description: str | None = None starts_at: datetime | None = None ends_at: datetime | None = None is_featured: bool | None = None cover_image_url: str | None = None cover_image_alt: str | None = None class TicketTypeAdmin(BaseModel): id: int event_id: int name: str description: str | None price_paise: int quantity_total: int quantity_sold: int remaining: int status: TicketTypeStatus sort_order: int model_config = {"from_attributes": True} class TicketTypeCreate(BaseModel): event_id: int name: str = Field(min_length=1, max_length=120) description: str | None = Field(default=None, max_length=512) price_paise: int = Field(ge=0) quantity_total: int = Field(ge=0) status: TicketTypeStatus = TicketTypeStatus.active sort_order: int = 0 class TicketTypeUpdate(BaseModel): name: str | None = Field(default=None, max_length=120) description: str | None = Field(default=None, max_length=512) price_paise: int | None = Field(default=None, ge=0) quantity_total: int | None = Field(default=None, ge=0) status: TicketTypeStatus | None = None sort_order: int | None = None class OrderAdmin(BaseModel): id: int user_id: int event_id: int status: OrderStatus total_paise: int currency: str provider_order_id: str | None provider_payment_id: str | None paid_at: datetime | None created_at: datetime model_config = {"from_attributes": True} class PaymentAdmin(BaseModel): order_id: int event_id: int status: OrderStatus total_paise: int provider_payment_id: str | None payment_reference: str | None paid_at: datetime | None