from __future__ import annotations
from typing import Optional, List
from decimal import Decimal
from datetime import datetime
from pydantic import BaseModel, Field


# ── Tax Classes ──────────────────────────────────────────────

class TaxClassCreate(BaseModel):
    name: str = Field(..., max_length=100)
    description: Optional[str] = Field(None, max_length=255)
    is_default: bool = False
    sort_order: int = 0


class TaxClassUpdate(BaseModel):
    name: Optional[str] = Field(None, max_length=100)
    description: Optional[str] = Field(None, max_length=255)
    is_default: Optional[bool] = None
    sort_order: Optional[int] = None


class TaxClassOut(BaseModel):
    id: int
    name: str
    description: Optional[str] = None
    is_default: bool = False
    sort_order: int = 0
    created_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


# ── Tax Rates ────────────────────────────────────────────────

class TaxRateCreate(BaseModel):
    name: str = Field(..., max_length=100)
    country: str = Field(..., min_length=2, max_length=2)
    province: Optional[str] = Field(None, max_length=100)
    rate: Decimal = Field(..., ge=0, le=Decimal("1.0000"))
    priority: int = Field(1, ge=0)
    compound: bool = False


class TaxRateUpdate(BaseModel):
    name: Optional[str] = Field(None, max_length=100)
    country: Optional[str] = Field(None, min_length=2, max_length=2)
    province: Optional[str] = None
    rate: Optional[Decimal] = Field(None, ge=0, le=Decimal("1.0000"))
    priority: Optional[int] = Field(None, ge=0)
    compound: Optional[bool] = None


class TaxRateOut(BaseModel):
    id: int
    tax_class_id: int
    name: str
    country: str
    province: Optional[str] = None
    rate: float
    priority: int = 1
    compound: bool = False
    created_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


# ── Tax Settings ─────────────────────────────────────────────

class TaxSettingsUpdate(BaseModel):
    prices_include_tax: Optional[bool] = None
    tax_shipping: Optional[bool] = None
    shipping_tax_class_id: Optional[int] = None
    display_prices_in_shop: Optional[str] = Field(None, pattern="^(incl|excl)$")
    display_prices_in_cart: Optional[str] = Field(None, pattern="^(incl|excl)$")
    tax_registration_no: Optional[str] = Field(None, max_length=100)
    rounding_mode: Optional[str] = Field(None, pattern="^(line|total)$")


class TaxSettingsOut(BaseModel):
    id: int
    prices_include_tax: bool = False
    tax_shipping: bool = False
    shipping_tax_class_id: Optional[int] = None
    display_prices_in_shop: str = "excl"
    display_prices_in_cart: str = "excl"
    tax_registration_no: Optional[str] = None
    rounding_mode: str = "line"

    model_config = {"from_attributes": True}
