"""
Payment Schemas
Wallet, transactions, and withdrawal management
"""
from typing import Optional, List
from pydantic import BaseModel, Field
from datetime import datetime

from app.models.payment import TransactionType, TransactionStatus, PaymentMethod, WithdrawalStatus


class WalletResponse(BaseModel):
    """Wallet balance response"""
    id: int
    user_id: int
    balance: int  # In cents
    pending_balance: int
    available_balance: int
    lifetime_credits: int
    lifetime_debits: int
    currency: str
    is_active: bool
    
    class Config:
        from_attributes = True


class WalletTopupRequest(BaseModel):
    """Wallet topup request"""
    amount: int = Field(..., gt=0, description="Amount in cents")
    payment_method: PaymentMethod = PaymentMethod.CARD
    payment_token: Optional[str] = Field(None, description="Payment gateway token")


class TransactionResponse(BaseModel):
    """Transaction details response"""
    id: int
    transaction_ref: str
    transaction_type: TransactionType
    amount: int
    fee: int
    net_amount: int
    balance_before: int
    balance_after: int
    status: TransactionStatus
    description: Optional[str] = None
    ride_id: Optional[int] = None
    created_at: datetime
    
    class Config:
        from_attributes = True


class TransactionListRequest(BaseModel):
    """Transaction list filter"""
    transaction_type: Optional[TransactionType] = None
    status: Optional[TransactionStatus] = None
    start_date: Optional[datetime] = None
    end_date: Optional[datetime] = None


class WithdrawalRequest(BaseModel):
    """Driver withdrawal request"""
    amount: int = Field(..., gt=0, description="Amount in cents")


class WithdrawalResponse(BaseModel):
    """Withdrawal request response"""
    id: int
    amount: int
    fee: int
    net_amount: int
    status: WithdrawalStatus
    bank_name: str
    bank_account_number: str  # Masked
    processed_at: Optional[datetime] = None
    rejection_reason: Optional[str] = None
    created_at: datetime
    
    class Config:
        from_attributes = True


class PaymentResponse(BaseModel):
    """Ride payment response"""
    id: int
    ride_id: int
    subtotal: int
    discount: int
    tax: int
    total: int
    payment_method: PaymentMethod
    status: TransactionStatus
    commission_rate: float
    commission_amount: int
    driver_amount: int
    paid_at: Optional[datetime] = None
    created_at: datetime
    
    class Config:
        from_attributes = True


class PaymentSummaryResponse(BaseModel):
    """Payment summary for admin dashboard"""
    total_revenue: int
    total_commission: int
    total_driver_payouts: int
    pending_payouts: int
    transaction_count: int
    period: str  # today, this_week, this_month


class EarningsBreakdownResponse(BaseModel):
    """Driver earnings breakdown"""
    period: str
    gross_earnings: int
    commission_paid: int
    net_earnings: int
    rides_completed: int
    tips_received: int
    bonuses: int
