from pydantic import BaseModel, ConfigDict, Field, field_validator
from typing import Optional
from datetime import datetime
from enum import Enum


class NotificationType(str, Enum):
    ORDER = "ORDER"
    MESSAGE = "MESSAGE"
    OFFER = "OFFER"
    REVIEW = "REVIEW"
    SHIPMENT = "SHIPMENT"
    PAYMENT = "PAYMENT"
    SYSTEM = "SYSTEM"
    PROMOTION = "PROMOTION"


class NotificationBase(BaseModel):
    user_id: str = Field(..., min_length=36, max_length=36)
    notification_type: str = Field(..., max_length=50)
    title: str = Field(..., min_length=1, max_length=255)
    message: str = Field(..., min_length=1)
    action_url: Optional[str] = Field(None, max_length=500)
    related_entity_type: Optional[str] = Field(None, max_length=50)
    related_entity_id: Optional[str] = Field(None, min_length=36, max_length=36)


class NotificationCreate(NotificationBase):
    pass


class NotificationUpdate(BaseModel):
    user_id: Optional[str] = Field(None, min_length=36, max_length=36)
    notification_type: Optional[str] = Field(None, max_length=50)
    title: Optional[str] = Field(None, min_length=1, max_length=255)
    message: Optional[str] = Field(None, min_length=1)
    is_read: Optional[bool] = None
    read_at: Optional[datetime] = None
    action_url: Optional[str] = Field(None, max_length=500)
    related_entity_type: Optional[str] = Field(None, max_length=50)
    related_entity_id: Optional[str] = Field(None, min_length=36, max_length=36)


class NotificationResponse(NotificationBase):
    id: str
    is_read: bool
    read_at: Optional[datetime]
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)