"""
Payment Request response schemas.
"""

from typing import List, Optional, Any, Dict
from datetime import datetime
from pydantic import BaseModel, Field

from src.apps.base.schemas.common import BaseSchema
from src.apps.payment_requests.enums import (
    PaymentCurrencies,
    PaymentFrequencies,
    PaymentAuthorizationTypes,
    PaymentRequestStatusTypes,
    SurchargeTypes,
    TaxType
)


class PaymentRequestLineItemResponseSchema(BaseSchema):
    """Response schema for payment request line items"""
    
    id: int = Field(description="Line item ID")
    title: str = Field(description="Title of line item")
    description: Optional[str] = Field(None,description="Description of line item")
    unit_price: float = Field(description="Unit price of item")
    quantity: int = Field(description="Quantity of items")
    tax: Optional[float] = Field(None,description="Tax for item")
    tax_amount: Optional[float] = Field(None,description="Calculated tax amount")
    product_id: Optional[int] = Field(None,description="Product ID reference")
    cost: Optional[float] = Field(None,description="Cost of item")
    upcharge: Optional[float] = Field(None,description="Upcharge amount")
    discount: Optional[float] = Field(None,description="Discount amount")
    created_at: Optional[datetime] = Field(None,description="Creation timestamp")
    updated_at: Optional[datetime] = Field(None,description="Last update timestamp")


class PaymentRequestCustomerResponseSchema(BaseSchema):
    """Response schema for payment request customer details"""
    
    payer_id: Optional[int] = Field(description="Payer ID")
    approver_id: Optional[int] = Field(description="Approver ID")
    payer_email_request_enabled: Optional[bool] = Field(description="Payer email request enabled")
    payer_email_receipt_enabled: Optional[bool] = Field(description="Payer email receipt enabled")
    payer_sms_request_enabled: Optional[bool] = Field(description="Payer SMS request enabled")
    payer_sms_receipt_enabled: Optional[bool] = Field(description="Payer SMS receipt enabled")
    approver_email_receipt_enabled: Optional[bool] = Field(description="Approver email receipt enabled")
    approver_sms_receipt_enabled: Optional[bool] = Field(description="Approver SMS receipt enabled")


class UserResponseSchema(BaseSchema):
    """Response schema for user information"""
    
    id: int = Field(description="User ID")
    user_id: str = Field(description="Unique user identifier")
    first_name: str = Field(description="User first name")
    last_name: str = Field(description="User last name")
    email: str = Field(description="User email address")


class SplitPaymentResponseSchema(BaseSchema):
    """Response schema for split payment configuration"""
    
    id: int = Field(description="Split payment ID")
    sequence: int = Field(description="Sequence number of split")
    split_type: str = Field(description="Type of split (percentage/amount)")
    split_value: float = Field(description="Value of split")
    due_amount: Optional[float] = Field(description="Calculated due amount")
    billing_date: datetime = Field(description="Billing date for split")
    due_date: datetime = Field(description="Due date for split")
    paid_date: Optional[datetime] = Field(description="Date when split was paid")
    created_at: Optional[datetime] = Field(description="Creation timestamp")


class RecurringPaymentResponseSchema(BaseSchema):
    """Response schema for recurring payment configuration"""
    
    id: int = Field(description="Recurring payment ID")
    prorate_first_payment: Optional[bool] = Field(description="Prorate first payment")
    prorate_date: Optional[datetime] = Field(description="Prorate date")
    start_date: datetime = Field(description="Start date for recurring payments")
    repeat_type: str = Field(description="Repeat type")
    interval: str = Field(description="Interval type")
    interval_value: Optional[int] = Field(description="Interval value")
    end_type: str = Field(description="End type")
    end_date: Optional[datetime] = Field(description="End date")
    pay_until_count: Optional[int] = Field(description="Pay until count")
    next_due_date: Optional[datetime] = Field(description="Next due date")
    next_due_amount: Optional[float] = Field(description="Next due amount")
    created_at: Optional[datetime] = Field(description="Creation timestamp")


class PaymentRequestResponseSchema(BaseSchema):
    """Response schema for payment request"""
    
    id: int = Field(description="Payment request internal ID")
    payment_request_id: str = Field(description="Unique payment request identifier")
    amount: float = Field(description="Payment amount")
    currency: PaymentCurrencies = Field(description="Payment currency")
    payment_frequency: PaymentFrequencies = Field(description="Payment frequency")
    authorization_type: Optional[PaymentAuthorizationTypes] = Field(None, description="Authorization type")
    status: PaymentRequestStatusTypes = Field(description="Payment request status")
    reference: Optional[str] = Field(None, description="Reference number")
    due_date: Optional[datetime] = Field(None,description="Due date")
    billing_date: Optional[datetime] = Field(None,description="Billing date")
    
    # Boolean flags
    save_payment_method: Optional[bool] = Field(None,description="Save payment method")
    allow_tip: Optional[bool] = Field(None,description="Allow tips")
    configure_adjustment: Optional[bool] = Field(None,description="Configure adjustment")
    is_surcharge_enabled: Optional[bool] = Field(None,description="Surcharge enabled")
    require_billing_address: Optional[bool] = Field(None,description="Require billing address")
    require_sms_authorization: Optional[bool] = Field(None,description="Require SMS authorization")
    require_shipping_address: Optional[bool] = Field(None,description="Require shipping address")
    require_signature_authorization: Optional[bool] = Field(None,description="Require signature authorization")
    require_cvv: Optional[bool] = Field(None,description="Require CVV")
    is_certified: Optional[bool] = Field(None,description="Is certified")
    enable_email: Optional[bool] = Field(None,description="Enable email notifications")
    enable_sms: Optional[bool] = Field(None,description="Enable SMS notifications")
    enable_email_receipt: Optional[bool] = Field(None,description="Enable email receipt")
    enable_sms_receipt: Optional[bool] = Field(None,description="Enable SMS receipt")
    
    # Additional fields
    surcharge_type: Optional[SurchargeTypes] = Field(None,description="Surcharge type")
    tax_type: Optional[TaxType] = Field(None,description="Tax type")
    tax_percent: Optional[float] = Field(None,description="Tax percentage")
    message: Optional[str] = Field(None,description="Payment message")
    description: Optional[str] = Field(None,description="Payment description")
    payment_split_frequency: Optional[str] = Field(None,description="Payment split frequency")
    payment_redirect_url: Optional[str] = Field(None,description="Payment redirect URL")
    shipping_fee: Optional[float] = Field(None,description="Shipping fee")
    shipping_address_id: Optional[int] = Field(None,description="Shipping address ID")
    invoice_terms: Optional[str] = Field(None,description="Invoice terms")
    
    # Relationships
    line_items: Optional[List[PaymentRequestLineItemResponseSchema]] = Field(None,description="Line items")
    payment_request_customers: Optional[List[PaymentRequestCustomerResponseSchema]] = Field(None,description="Customer details")
    created_by: Optional[UserResponseSchema] = Field(None,description="Created by user")
    split_config: Optional[List[SplitPaymentResponseSchema]] = Field(None,description="Split configuration")
    recurring_config: Optional[RecurringPaymentResponseSchema] = Field(None,description="Recurring configuration")
    
    # Timestamps
    created_at: Optional[datetime] = Field(description="Creation timestamp")
    updated_at: Optional[datetime] = Field(description="Last update timestamp")
    deleted_at: Optional[datetime] = Field(None,description="Deletion timestamp")
    
    class Config:
        """Schema configuration"""
        json_schema_extra = {
            "example": {
                "id": 1,
                "payment_request_id": "pr_1234567890abcdef",
                "amount": 100.0,
                "currency": "usd",
                "payment_frequency": "one_time",
                "authorization_type": "request_auth",
                "status": "full_amount_pending",
                "reference": "REF001",
                "due_date": "2021-10-25T19:29:17.454292+00:00",
                "billing_date": "2021-10-25T19:29:17.454292+00:00",
                "save_payment_method": False,
                "allow_tip": False,
                "configure_adjustment": False,
                "message": "Payment for services",
                "created_at": "2021-10-25T19:29:17.454292+00:00",
                "line_items": [
                    {
                        "id": 1,
                        "title": "Service Fee",
                        "description": "Monthly service fee",
                        "unit_price": 100.0,
                        "quantity": 1,
                        "tax": 0.0
                    }
                ],
                "created_by": {
                    "id": 1,
                    "user_id": "usr_1234567890",
                    "first_name": "John",
                    "last_name": "Doe",
                    "email": "john.doe@example.com"
                }
            }
        }


class PaymentRequestListResponseSchema(BaseModel):
    """Response schema for payment request list"""
    
    items: List[PaymentRequestResponseSchema] = Field(description="List of payment requests")
    total: int = Field(description="Total number of items")
    page: int = Field(description="Current page")
    per_page: int = Field(description="Items per page")
    total_pages: int = Field(description="Total number of pages")
    has_next: bool = Field(description="Has next page")
    has_previous: bool = Field(description="Has previous page")
    
    class Config:
        """Schema configuration"""
        json_schema_extra = {
            "example": {
                "items": [],
                "total": 0,
                "page": 1,
                "per_page": 20,
                "total_pages": 0,
                "has_next": False,
                "has_previous": False
            }
        }