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

# Admin Product Specification Schema
class AdminSpecificationBase(BaseModel):
    id: Optional[int] = None
    size_name: str
    dimensions: Optional[str] = None
    gauge: Optional[str] = None
    material_grade: Optional[str] = None
    packing_unit: Optional[str] = None
    display_order: int = 0

# Admin Product Image Schema
class AdminImageBase(BaseModel):
    id: Optional[int] = None
    image_url: str
    alt_text: Optional[str] = None
    is_primary: bool = False
    display_order: int = 0

# Admin Product Create/Update Schema
class AdminProductCreateUpdate(BaseModel):
    category_id: int
    name: str = Field(..., min_length=2, max_length=200)
    slug: Optional[str] = None
    description: Optional[str] = None
    features: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    is_active: bool = True
    is_featured: bool = False
    display_order: int = 0
    # Private Admin-Only Fields
    private_mrp: Optional[str] = None
    private_cost_price: Optional[str] = None
    private_notes: Optional[str] = None
    specifications: List[AdminSpecificationBase] = []
    images: List[AdminImageBase] = []

# Admin Product Detail Response
class AdminProductResponse(BaseModel):
    id: int
    category_id: int
    category_name: Optional[str] = None
    name: str
    slug: str
    description: Optional[str] = None
    features: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    is_active: bool
    is_featured: bool
    display_order: int
    private_mrp: Optional[str] = None
    private_cost_price: Optional[str] = None
    private_notes: Optional[str] = None
    created_at: datetime
    updated_at: datetime
    specifications: List[AdminSpecificationBase] = []
    images: List[AdminImageBase] = []

    class Config:
        from_attributes = True

# Admin Category Create/Update
class AdminCategoryCreateUpdate(BaseModel):
    name: str = Field(..., min_length=2, max_length=100)
    slug: Optional[str] = None
    description: Optional[str] = None
    image_url: Optional[str] = None
    icon_name: Optional[str] = None
    display_order: int = 0
    is_active: bool = True

class AdminCategoryResponse(BaseModel):
    id: int
    name: str
    slug: str
    description: Optional[str] = None
    image_url: Optional[str] = None
    icon_name: Optional[str] = None
    display_order: int
    is_active: bool
    product_count: int = 0
    created_at: datetime

    class Config:
        from_attributes = True

# Admin Enquiry Item Response
class AdminEnquiryItemResponse(BaseModel):
    id: int
    product_id: Optional[int] = None
    product_name: str
    product_slug: Optional[str] = None
    selected_specification: Optional[str] = None
    quantity: str
    product_image_url: Optional[str] = None

    class Config:
        from_attributes = True

# Admin Enquiry Response
class AdminEnquiryResponse(BaseModel):
    id: int
    enquiry_number: str
    customer_name: str
    shop_name: Optional[str] = None
    mobile_whatsapp: str
    city: str
    message: Optional[str] = None
    status: str
    admin_notes: Optional[str] = None
    total_items: int
    created_at: datetime
    updated_at: datetime
    items: List[AdminEnquiryItemResponse] = []

    class Config:
        from_attributes = True

class AdminEnquiryStatusUpdate(BaseModel):
    status: str
    admin_notes: Optional[str] = None

# Admin Dashboard Stats
class AdminDashboardStats(BaseModel):
    new_enquiries_count: int
    total_enquiries: int
    total_products: int
    total_categories: int
    active_products: int
    recent_enquiries: List[AdminEnquiryResponse] = []

# Admin System Setting Update
class AdminSettingUpdate(BaseModel):
    key_name: str
    value: str
    description: Optional[str] = None
