"""Campaign schemas."""

from __future__ import annotations

from datetime import datetime

from pydantic import Field, field_validator

from app.models.enums import CampaignStatus
from app.schemas.base import CamelModel


class CampaignSettingsBase(CamelModel):
    daily_task_limit: int = Field(default=25, ge=1, le=500)
    auto_generate_messages: bool = True
    auto_create_tasks: bool = True
    stop_followups_on_reply: bool = True
    require_approval: bool = True
    followup_days: list[int] = Field(default_factory=lambda: [3, 7, 14])

    @field_validator("followup_days")
    @classmethod
    def _validate_days(cls, value: list[int]) -> list[int]:
        cleaned = sorted({int(day) for day in value if int(day) > 0})
        if len(cleaned) > 3:
            cleaned = cleaned[:3]
        return cleaned or [3, 7, 14]


class CampaignSettingsRead(CampaignSettingsBase):
    id: int
    campaign_id: int


class CampaignBase(CamelModel):
    name: str = Field(min_length=1, max_length=160)
    description: str | None = None
    status: CampaignStatus = CampaignStatus.DRAFT
    target_industries: list[str] = Field(default_factory=list)
    target_locations: list[str] = Field(default_factory=list)
    target_titles: list[str] = Field(default_factory=list)
    keywords: list[str] = Field(default_factory=list)
    exclude_keywords: list[str] = Field(default_factory=list)
    company_size_min: int | None = Field(default=None, ge=0)
    company_size_max: int | None = Field(default=None, ge=0)
    min_score: int = Field(default=70, ge=0, le=100)
    outreach_objective: str | None = None
    default_template_id: int | None = None

    @field_validator(
        "target_industries",
        "target_locations",
        "target_titles",
        "keywords",
        "exclude_keywords",
        mode="before",
    )
    @classmethod
    def _coerce_list(cls, value: object) -> list[str]:
        if value is None:
            return []
        if isinstance(value, str):
            return [item.strip() for item in value.split(",") if item.strip()]
        return [str(item).strip() for item in value if str(item).strip()]


class CampaignCreate(CampaignBase):
    settings: CampaignSettingsBase | None = None
    seed_default_rules: bool = False


class CampaignUpdate(CamelModel):
    name: str | None = Field(default=None, min_length=1, max_length=160)
    description: str | None = None
    status: CampaignStatus | None = None
    target_industries: list[str] | None = None
    target_locations: list[str] | None = None
    target_titles: list[str] | None = None
    keywords: list[str] | None = None
    exclude_keywords: list[str] | None = None
    company_size_min: int | None = None
    company_size_max: int | None = None
    min_score: int | None = Field(default=None, ge=0, le=100)
    outreach_objective: str | None = None
    default_template_id: int | None = None
    settings: CampaignSettingsBase | None = None


class CampaignStats(CamelModel):
    total_leads: int = 0
    qualified: int = 0
    hot: int = 0
    rejected: int = 0
    pending_tasks: int = 0
    completed_tasks: int = 0
    replies: int = 0


class CampaignRead(CampaignBase):
    id: int
    created_at: datetime
    updated_at: datetime
    settings: CampaignSettingsRead | None = None
    stats: CampaignStats | None = None
