from datetime import date, datetime from pydantic import BaseModel from .pagination import PaginatedResponse class ExchangeRequest(BaseModel): """Request to create an exchange trade.""" slot_start: datetime direction: str # "buy" or "sell" bitcoin_transfer_method: str # "onchain" or "lightning" eur_amount: int # EUR cents (e.g., 10000 = €100) class ExchangeUserContact(BaseModel): """User contact info for admin view.""" email: str contact_email: str | None telegram: str | None signal: str | None nostr_npub: str | None class ExchangeResponse(BaseModel): """Response model for an exchange trade.""" id: int # Keep for backward compatibility, but prefer public_id public_id: str # UUID as string user_id: int user_email: str slot_start: datetime slot_end: datetime direction: str bitcoin_transfer_method: str eur_amount: int # EUR cents sats_amount: int # Satoshis market_price_eur: float agreed_price_eur: float premium_percentage: int status: str created_at: datetime cancelled_at: datetime | None completed_at: datetime | None class AdminExchangeResponse(BaseModel): """Response model for admin exchange view (includes user contact).""" id: int # Keep for backward compatibility, but prefer public_id public_id: str # UUID as string user_id: int user_email: str user_contact: ExchangeUserContact slot_start: datetime slot_end: datetime direction: str bitcoin_transfer_method: str eur_amount: int sats_amount: int market_price_eur: float agreed_price_eur: float premium_percentage: int status: str created_at: datetime cancelled_at: datetime | None completed_at: datetime | None PaginatedExchanges = PaginatedResponse[ExchangeResponse] PaginatedAdminExchanges = PaginatedResponse[AdminExchangeResponse] class BookableSlot(BaseModel): """A single bookable time slot.""" start_time: datetime end_time: datetime class AvailableSlotsResponse(BaseModel): """Response containing available slots for a date.""" date: date slots: list[BookableSlot]