from pydantic import BaseModel, ConfigDict, field_validator
from typing import Optional, List
from datetime import datetime
from decimal import Decimal


class WatchlistBase(BaseModel):
    name: str
    description: Optional[str] = None
    is_default: bool = False
    sort_order: int


class WatchlistCreate(WatchlistBase):
    user_id: str

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        if not v or len(v) < 1 or len(v) > 50:
            raise ValueError("Watchlist name must be 1-50 characters")
        return v


class WatchlistUpdate(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    is_default: Optional[bool] = None
    sort_order: Optional[int] = None

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and (len(v) < 1 or len(v) > 50):
            raise ValueError("Watchlist name must be 1-50 characters")
        return v


class WatchlistResponse(WatchlistBase):
    id: str
    user_id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class WatchlistitemBase(BaseModel):
    watchlist_id: str
    stock_id: str
    added_date: datetime
    notes: Optional[str] = None
    sort_order: int


class WatchlistitemCreate(WatchlistitemBase):
    pass


class WatchlistitemUpdate(BaseModel):
    notes: Optional[str] = None
    sort_order: Optional[int] = None


class WatchlistitemResponse(WatchlistitemBase):
    id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class StockInWatchlistResponse(BaseModel):
    id: str
    ticker_symbol: str
    company_name: str
    current_price: Optional[Decimal]
    sector_name: Optional[str]
    exchange_name: Optional[str]

    model_config = ConfigDict(from_attributes=True)


class WatchlistitemDetailResponse(BaseModel):
    id: str
    watchlist_id: str
    stock_id: str
    added_date: datetime
    notes: Optional[str]
    sort_order: int
    stock: StockInWatchlistResponse

    model_config = ConfigDict(from_attributes=True)


class WatchlistDetailResponse(BaseModel):
    id: str
    user_id: str
    name: str
    description: Optional[str]
    is_default: bool
    sort_order: int
    created_at: datetime
    updated_at: datetime
    watchlist_items: List[WatchlistitemDetailResponse]

    model_config = ConfigDict(from_attributes=True)