from __future__ import annotations
from typing import Optional, List
from decimal import Decimal
from datetime import datetime
from pydantic import BaseModel


class OrderStatusUpdate(BaseModel):
    status: str   # pending / paid / shipped / completed / cancelled


class OrderItemOut(BaseModel):
    id: int
    product_id: Optional[int] = None
    product_name: str = ""
    name: str = ""          # 前端模板使用 item.name，与 product_name 同值
    sku: str = ""
    qty: Decimal
    unit_price: Decimal
    subtotal: Decimal
    image_url: Optional[str] = None
    variant_label: Optional[str] = None
    variant_id: Optional[int] = None
    tax_rate: Decimal = Decimal("0")
    tax_amount: Decimal = Decimal("0")

    model_config = {"from_attributes": True}


class OrderOut(BaseModel):
    id: int
    order_no: str
    status: str
    grand_total: Decimal
    currency: str = "NZD"
    display_currency: Optional[str] = None
    display_currency_symbol: Optional[str] = None
    display_grand_total: Optional[Decimal] = None
    items_count: int = 0
    customer_name: Optional[str] = None
    created_at: Optional[datetime] = None
    pay_method: Optional[str] = None

    model_config = {"from_attributes": True}


class OrderDetailOut(OrderOut):
    subtotal: Decimal = Decimal("0")
    shipping_fee: Decimal = Decimal("0")
    discount_total: Decimal = Decimal("0")
    member_discount: Decimal = Decimal("0")  # 会员价优惠
    wallet_amount: Decimal = Decimal("0")    # 余额抵扣
    payable_total: Decimal = Decimal("0")    # 需第三方支付金额
    shipping_address: Optional[dict] = None
    purchase_order_number: Optional[str] = None
    delivery_type: Optional[int] = None
    pickup_code: Optional[str] = None        # 到店取货核销码（delivery_type==2）
    shipping_method_id: Optional[int] = None
    remark: Optional[str] = None
    items: List[OrderItemOut] = []
    coupon_code: Optional[str] = None
    coupon_label: Optional[str] = None
    paid_at: Optional[datetime] = None
    promotions: List[dict] = []              # [{label, amount}]
    points_used: int = 0
    carrier: Optional[str] = None
    tracking_no: Optional[str] = None
    estimated_delivery: Optional[str] = None
    shipments: List[dict] = []
    refund_requests: List[dict] = []
    tax_total: Decimal = Decimal("0")
    tax_details: List[dict] = []
    prices_include_tax: bool = False
    billing_address: Optional[dict] = None
    adjustments: List[dict] = []
    payments: List[dict] = []
