from datetime import datetime
from typing import List, Optional
from pydantic import Field, ConfigDict
from src.apps.users.schemas.user_common import UserResponseSchema
from src.apps.base.schemas.common import AddressSchema, BaseSchema
from src.apps.files.schemas.file_common import FileResponseSchema
from src.apps.merchants.schemas.merchant_common import MerchantSchema
from src.core.utils.enums import BusinessCategories, BusinessTypes
from src.apps.customers.schemas.customer_contact import CustomerContactSchema


# Shared properties
class CustomerBase(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    uin: Optional[str] = Field(
        default=None,
        description="UIN of Customer, inclusive of alphanumeric characters only"
    )
    account_type: Optional[BusinessTypes] = Field(
        default=None,
        description="Account type of customer"
    )
    industry: Optional[str] = Field(default=None, description="Industry type of customer")
    office_phone: Optional[str] = Field(
        default=None,
        description="Official contact of customer. A valid phone number"
    )
    account_expires_on: Optional[datetime] = Field(default=None, description="Account Expiry date")
    timezone: Optional[str] = Field(default=None, description="Selected timezone of customer")
    website: Optional[str] = Field(default=None, description="Website of customer")
    account_tax_id: Optional[str] = Field(default=None, description="Tax Id of customer")
    account_literal: Optional[str] = Field(
        default=None,
        description="Public-facing account number (15 characters) - this is what users see instead of the internal customer_id"
    )


class CustomerSchema(CustomerBase):
    model_config = ConfigDict(
        from_attributes=True, 
        populate_by_name=True, 
        by_alias=False,
        json_schema_extra={
            "example": {
                "id": 123,
                "customer_id": "cus_1234567890abcdef",
                "tilled_id": "till_abc123def456",
                "first_name": "John",
                "last_name": "Doe",
                "email": "john.doe@example.com",
                "phone": "+1234567890",
                "business_legal_name": "Doe Industries LLC",
                "customer_type": "Business Customer",
                "is_vendor": False,
                "is_active": True,
                "account_literal": "ACC123456789012",
                "timezone": "America/New_York",
                "tags": ["premium", "b2b"],
                "created_at": "2024-01-15T10:30:00Z",
                "updated_at": "2024-01-20T14:25:00Z",
                "addresses": [
                    {
                        "id": 1,
                        "address_line_1": "123 Business Avenue",
                        "address_line_2": "Suite 400",
                        "city": "New York",
                        "state": "NY",
                        "zipcode": "10001",
                        "country": "US",
                        "address_type": "billing",
                        "use_as_default": True,
                        "is_active": True
                    }
                ],
                "contacts": [
                    {
                        "id": 1,
                        "contact_id": "con_abcd1234efgh5678",
                        "first_name": "Jane",
                        "last_name": "Smith",
                        "email": "jane.smith@example.com",
                        "account_phone": "+1555123456",
                        "title": "Account Manager",
                        "is_active": True
                    }
                ]
            }
        }
    )
    
    id: Optional[int] = Field(default=None, description="Id of Customer resource")
    customer_id: str = Field(
        description="Unique id of customer, typically attains the form 'cus_xxx' "
    )
    tilled_id: Optional[str] = Field(default=None, description="Unique tilled id of customer")
    is_active: Optional[bool] = Field(
        default=None,
        description="Activation status of Customer, false denotes that the Customer is inactive"
    )
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
    updated_at: Optional[datetime] = Field(
        default=None,
        description="Updated date and time as unix timestamp"
    )
    deleted_at: Optional[datetime] = Field(
        default=None,
        description="Deleted date and time as unix timestamp"
    )
    # merchant: Optional[MerchantSchema] = Field(
    #     default=None,
    #     description="Merchant of this customer account"
    # )
    avatar: Optional[FileResponseSchema] = Field(
        default=None,
        description="Profile picture / avatar of customer"
    )
    address: Optional[List[AddressSchema]] = Field(
        default=None,
        description="Customer's available addresses list",
        alias="addresses"
    )
    tags: Optional[List[str]] = Field(
        default=None, 
        description="Tags of customer",
        alias="tags_list"
    )
    contacts: Optional[List[CustomerContactSchema]] = Field(
        default=None,
        description="Customer's available contacts list"
    )
    is_vendor: Optional[bool] = Field(default=None, description="Is this customer a vendor?")
    customer_type: Optional[str] = Field(default=None, description="Type of customer (customer/vendor)")
    is_registered: Optional[bool] = Field(
        default=None,
        description="Is this customer registered with fluxpay?"
    )
    user_account: Optional[UserResponseSchema] = Field(
        default=None,
        description="Registered account of this customer"
    )
    default_address: Optional[AddressSchema] = Field(
        default=None,
        description="Default Address of this customer"
    )
    billing_address: Optional[AddressSchema] = Field(
        default=None,
        description="Billing Address of this customer"
    )
    shipping_address: Optional[AddressSchema] = Field(
        default=None,
        description="Shipping Address of this customer"
    )
    attachments: Optional[List[FileResponseSchema]] = Field(
        default=None,
        description="Attatch Multiple files for customer"
    )
    first_name: Optional[str] = Field(default=None, description="First name of the customer")
    middle_name: Optional[str] = Field(default=None, description="Middle name of the customer")
    last_name: Optional[str] = Field(default=None, description="Last name of the customer")
    email: Optional[str] = Field(default=None, description="Email address of the customer")
    phone: Optional[str] = Field(default=None, description="Phone Number of the customer")
    office_phone: Optional[str] = Field(default=None, description="Office Phone of the customer")
    business_legal_name: Optional[str] = Field(default=None, description="Legal name of the business")
    last_active_date: Optional[datetime] = Field(default=None, description="Last activity date")


class CustomerListSchema(CustomerBase):
    model_config = ConfigDict(
        from_attributes=True, 
        populate_by_name=True, 
        by_alias=False,
        json_schema_extra={
            "example": {
                "id": 456,
                "customer_id": "cus_9876543210fedcba",
                "tilled_id": "till_xyz789uvw012",
                "first_name": "Alice",
                "last_name": "Johnson",
                "email": "alice.johnson@example.com",
                "phone": "+1987654321",
                "business_legal_name": "Johnson Enterprises Inc",
                "customer_type": "Enterprise Customer",
                "is_vendor": True,
                "is_active": True,
                "account_literal": "ENT987654321098",
                "timezone": "America/Los_Angeles",
                "created_at": "2024-02-01T09:15:00Z",
                "updated_at": "2024-02-10T16:45:00Z"
            }
        }
    )
    
    id: Optional[int] = Field(default=None, description="Id of Customer resource")
    customer_id: str = Field(
        description="Unique id of customer, typically attains the form 'cus_xxx' "
    )
    tilled_id: Optional[str] = Field(default=None, description="Unique tilled id of customer")
    is_active: Optional[bool] = Field(
        default=None,
        description="Activation status of Customer, false denotes that the Customer is inactive"
    )
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
    updated_at: Optional[datetime] = Field(
        default=None,
        description="Updated date and time as unix timestamp"
    )
    deleted_at: Optional[datetime] = Field(
        default=None,
        description="Deleted date and time as unix timestamp"
    )
    merchant: Optional[MerchantSchema] = Field(
        default=None,
        description="Merchant of this customer account"
    )
    default_address: Optional[AddressSchema] = Field(
        default=None,
        description="Default Address of this customer"
    )
    address: Optional[List[AddressSchema]] = Field(
        default=None,
        description="Customer's available addresses list",
        alias="addresses"
    )
    avatar: Optional[FileResponseSchema] = Field(
        default=None,
        description="Profile picture / avatar of customer"
    )
    contacts: Optional[List[CustomerContactSchema]] = Field(
        default=None,
        description="Customer's available contacts list"
    )
    is_vendor: Optional[bool] = Field(default=None, description="Is this customer a vendor?")
    customer_type: Optional[str] = Field(default=None, description="Type of customer (customer/vendor)")
    is_registered: Optional[bool] = Field(
        default=None,
        description="Is this customer registered with fluxpay?"
    )
    user_account: Optional[UserResponseSchema] = Field(
        default=None,
        description="Registered account of this customer"
    )
    first_name: Optional[str] = Field(default=None, description="First name of the customer")
    middle_name: Optional[str] = Field(default=None, description="Middle name of the customer")
    last_name: Optional[str] = Field(default=None, description="Last name of the customer")
    email: Optional[str] = Field(default=None, description="Email address of the customer")
    phone: Optional[str] = Field(default=None, description="Phone Number of the customer")
    office_phone: Optional[str] = Field(default=None, description="Office Phone of the customer")
    business_legal_name: Optional[str] = Field(default=None, description="Legal name of the business")
    last_active_date: Optional[datetime] = Field(default=None, description="Last activity date")
    upcoming_invoice_amount: Optional[float] = Field(
        default=None,
        description="Total Invoice Pending Amount"
    )
    past_due_amount: Optional[float] = Field(default=None, description="Total Invoice Overdue Amount")


class CustomerUserSchema(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    user: Optional[UserResponseSchema] = Field(
        default=None,
        description="The user resource associated with this merchant"
    )



