from pydantic import BaseModel, EmailStr
from datetime import datetime


# Auth schemas
class UserLogin(BaseModel):
    email: EmailStr
    password: str


class UserRegister(BaseModel):
    email: EmailStr
    password: str
    tenant_name: str
    industry: str  # medicine, beauty, autoservice, delivery, education, other


class Token(BaseModel):
    access_token: str
    token_type: str = "bearer"


class TokenWithUser(BaseModel):
    access_token: str
    token_type: str = "bearer"
    user: dict


# Tenant/Project schemas
class TenantCreate(BaseModel):
    name: str


class TenantOut(BaseModel):
    id: int
    name: str
    status: str
    created_at: datetime

    class Config:
        from_attributes = True


# Customer schemas
class CustomerCreate(BaseModel):
    phone: str | None = None
    email: EmailStr | None = None
    tg_chat_id: str | None = None
    vk_user_id: str | None = None
    tags: list[str] = []
    meta: dict = {}


class CustomerOut(BaseModel):
    id: int
    tenant_id: int
    phone: str | None
    email: str | None
    tg_chat_id: str | None
    vk_user_id: str | None
    tags: list[str]
    meta: dict
    created_at: datetime

    class Config:
        from_attributes = True


# Template schemas
class TemplateCreate(BaseModel):
    name: str
    slug: str | None = None  # Если не указан, будет сгенерирован автоматически
    channel_strategy: dict = {"primary": ["email"], "failover": False}
    # channel_config временно закомментировано до создания миграции БД
    # channel_config: dict | None = None  # {"email_config_id": 1, "telegram_bot_id": 2, "vk_group_id": 3}
    content: str
    variables: list[str] = []


class TemplateOut(BaseModel):
    id: int
    tenant_id: int
    name: str
    slug: str
    channel_strategy: dict
    # channel_config временно закомментировано до создания миграции БД
    # channel_config: dict | None = {}
    content: str
    variables: list[str]
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Notification schemas
class NotificationSend(BaseModel):
    template_id: int
    customer_id: int | None = None
    segment_id: int | None = None
    payload: dict = {}
    scheduled_at: datetime | None = None
    idempotency_key: str | None = None


class NotificationOut(BaseModel):
    id: int
    tenant_id: int
    template_id: int
    status: str
    created_at: datetime

    class Config:
        from_attributes = True


# Analytics schemas
class AnalyticsOverview(BaseModel):
    total_sent: int
    total_delivered: int
    total_opened: int
    total_clicked: int
    delivery_rate: float
    open_rate: float
    click_rate: float


class ChannelStats(BaseModel):
    channel: str
    sent: int
    delivered: int
    opened: int
    clicked: int
    delivery_rate: float
    open_rate: float
    click_rate: float


class TemplateStats(BaseModel):
    id: int
    name: str
    sent: int
    delivered: int
    opened: int
    clicked: int
    delivery_rate: float
    open_rate: float
    click_rate: float


class TimelineStats(BaseModel):
    period: str  # "2024-10-10", "2024-10-10 15:00", etc.
    sent: int
    delivered: int
    opened: int
    clicked: int


class AnalyticsResponse(BaseModel):
    overview: AnalyticsOverview
    by_channel: list[ChannelStats]
    by_template: list[TemplateStats]
    timeline: list[TimelineStats]


# Tracking schemas
class TrackingPixel(BaseModel):
    delivery_id: int


class TrackingClick(BaseModel):
    delivery_id: int
    url: str | None = None


