from pydantic import BaseModel ,EmailStr
from datetime import datetime
from typing import Optional, Any,List,Dict

# ---------------- NotificationChannel ----------------
class NotificationChannelBase(BaseModel):
    name: str

class NotificationChannelCreate(NotificationChannelBase):
    pass

class NotificationChannelRead(NotificationChannelBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True


# ---------------- NotificationType ----------------
class NotificationTypeBase(BaseModel):
    name: str

class NotificationTypeCreate(NotificationTypeBase):
    pass

class NotificationTypeRead(NotificationTypeBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True


# ---------------- TargetType ----------------
class TargetTypeBase(BaseModel):
    name: str

class TargetTypeCreate(TargetTypeBase):
    pass

class TargetTypeRead(TargetTypeBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True


# ---------------- TargetURLType ----------------
class TargetURLTypeBase(BaseModel):
    name: str

class TargetURLTypeCreate(TargetURLTypeBase):
    pass

class TargetURLTypeRead(TargetURLTypeBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True


# ---------------- Notification ----------------
class NotificationBase(BaseModel):
    data: dict[str, Any]
    notification_type_id: int
    notification_chanel_id: int
    delivery: Optional[bool] = True

class NotificationCreate(NotificationBase):
    pass

class NotificationRead(NotificationBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True


# ---------------- TargetURL ----------------
class TargetURLBase(BaseModel):
    url: str
    target_url_type_id: Optional[int]
    method_id: int
    data: Dict[str, Any] 

class TargetURLCreate(TargetURLBase):
    pass

class TargetURLRead(TargetURLBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True


# -------- Notification Channel --------
class NotificationChannelRead(BaseModel):
    id: int
    name: str

    class Config:
        orm_mode = True
class UserTargetChannel(BaseModel):
    id: int
    notification_frequency_minutes:int
    channel_id:int
    class Config:
        orm_mode = True
        
# -------- Target --------
class TargetBase(BaseModel):
    name: str
    base_url: str
    code: str
    target_type_id: int

class TargetCreate(TargetBase):
    channel_ids: Optional[List[int]] = []

class TargetRead(TargetBase):
    id: int
    created_at: datetime
    updated_at: datetime
    deleted_at: Optional[datetime]
    notification_channels: List[NotificationChannelRead] = []
    user_target_channels: List[UserTargetChannel] = []

    class Config:
        orm_mode = True
        
class TargetUpdate(BaseModel):
    name: Optional[str] = None
    base_url: Optional[str] = None
    code: Optional[str] = None
    target_type_id: Optional[int] = None
    channel_ids: Optional[List[int]] = None
    
    
# -------- Users --------

class UserCreate(BaseModel):
    username: str
    email: EmailStr
    password: str

class UserRead(BaseModel):
    id: int
    username: str
    email: EmailStr
    is_verified: bool
    is_active: bool
    is_logged_in: bool
    created_at: datetime
    updated_at: Optional[datetime]
    deleted_at: Optional[datetime]

    class Config:
        orm_mode = True
class UserUpdate(BaseModel):
    username: Optional[str]
    email: Optional[EmailStr]
    password: Optional[str]
    is_active: Optional[bool]
    is_verified: Optional[bool]
    is_logged_in: Optional[bool]

