"""
Transaction Response Schemas - Enhanced response models for transaction reports
"""

from datetime import datetime
from typing import Optional, List, Dict, Any
from pydantic import Field, ConfigDict
from src.apps.base.schemas.common import BaseSchema


# Transaction Report Response Schemas
class TransactionReportResponseSchema(BaseSchema):
    """Transaction report response matching the API structure"""
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Transaction database ID")
    txn_amount: float = Field(description="Transaction amount")
    txn_type: Optional[str] = Field(None, description="Transaction type (card, ach, etc)")
    txn_status: int = Field(description="Transaction status code")
    ocurred_at: datetime = Field(description="Transaction occurrence timestamp")
    txn_id: str = Field(description="Unique transaction ID")
    txn_literal: Optional[str] = Field(None, description="Human-readable transaction literal")
    reference_id: Optional[str] = Field(None, description="External reference ID")
    description: Optional[str] = Field(None, description="Transaction description")
    currency: str = Field(default="usd", description="Currency code")
    platform_fee_amount: Optional[float] = Field(None, description="Platform fee amount")
    billing_name: Optional[str] = Field(None, description="Billing name")
    category: Optional[str] = Field(None, description="Transaction category")
    charge_type: Optional[str] = Field(None, description="Charge type")
    additional_info: Optional[Dict[str, Any]] = Field(None, description="Additional metadata")
    status_text: Optional[str] = Field(None, description="Human-readable status")
    refundable_balance: Optional[float] = Field(None, description="Refundable balance")
    auth_amount: Optional[float] = Field(None, description="Authorization amount")
    txn_source: Optional[str] = Field(None, description="Transaction source")
    
    # Nested relationships (will be populated conditionally)
    merchant: Optional[Any] = Field(None, description="Merchant details")
    customer: Optional[Any] = Field(None, description="Customer details")
    payment_method: Optional[Any] = Field(None, description="Payment method details")
    payment_request: Optional[Any] = Field(None, description="Payment request details")
    invoices: Optional[Any] = Field(None, description="Invoice details")
    billing_address: Optional[Any] = Field(None, description="Billing address")


class TransactionReportListResponseSchema(BaseSchema):
    """Paginated transaction report list response"""
    allowed_fields: List[str] = Field(
        description="Fields that can be included in the response"
    )
    total: int = Field(description="Total number of transactions")
    page: int = Field(description="Current page number")
    per_page: int = Field(description="Items per page")
    next: Optional[str] = Field(None, description="Next page URL")
    previous: Optional[str] = Field(None, description="Previous page URL")
    first: Optional[str] = Field(None, description="First page URL")
    last: Optional[str] = Field(None, description="Last page URL")
    result: List[TransactionReportResponseSchema] = Field(
        description="List of transactions"
    )
