"""Lead / prospect schemas."""

from __future__ import annotations

from datetime import datetime
from typing import Any

from pydantic import Field, field_validator

from app.models.enums import ConnectionStatus, LeadStatus, MessageStatus, ReplyStatus
from app.schemas.base import CamelModel


class LeadBase(CamelModel):
    first_name: str | None = None
    last_name: str | None = None
    full_name: str | None = None
    job_title: str | None = None
    company: str | None = None
    industry: str | None = None
    location: str | None = None
    company_size: int | None = Field(default=None, ge=0)
    headline: str | None = None
    about: str | None = None
    profile_url: str | None = None
    website: str | None = None
    keywords: list[str] = Field(default_factory=list)
    tags: list[str] = Field(default_factory=list)

    @field_validator("keywords", "tags", 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 LeadCreate(LeadBase):
    campaign_id: int | None = None
    source: str = "manual"


class LeadUpdate(LeadBase):
    campaign_id: int | None = None
    connection_status: ConnectionStatus | None = None
    message_status: MessageStatus | None = None
    reply_status: ReplyStatus | None = None


class ScoreReason(CamelModel):
    rule_id: int | None = Field(default=None, alias="ruleId")
    name: str = ""
    points: int = 0
    action: str = "score"
    detail: str | None = None
    source: str = "custom"


class LeadRead(LeadBase):
    id: int
    campaign_id: int | None = None
    campaign_name: str | None = None
    score: int = 0
    status: LeadStatus = LeadStatus.COLD
    score_reasons: list[dict[str, Any]] = Field(default_factory=list)
    is_rejected: bool = False
    rejection_reason: str | None = None
    connection_status: ConnectionStatus = ConnectionStatus.NOT_CONNECTED
    message_status: MessageStatus = MessageStatus.NOT_SENT
    reply_status: ReplyStatus = ReplyStatus.NO_REPLY
    source: str = "manual"
    last_activity_at: datetime | None = None
    created_at: datetime
    updated_at: datetime


class ActivityRead(CamelModel):
    id: int
    activity_type: str
    description: str | None = None
    payload: dict[str, Any] = Field(default_factory=dict)
    created_at: datetime
    task_id: int | None = None


class LeadScoreRead(CamelModel):
    id: int
    score: int
    raw_score: int
    status: str
    rejected: bool
    reasons: list[dict[str, Any]] = Field(default_factory=list)
    rule_results: list[dict[str, Any]] = Field(default_factory=list)
    evaluated_at: datetime


class LeadDetail(LeadRead):
    activities: list[ActivityRead] = Field(default_factory=list)
    scores: list[LeadScoreRead] = Field(default_factory=list)
    tasks: list[dict[str, Any]] = Field(default_factory=list)
    replies: list[dict[str, Any]] = Field(default_factory=list)
    rule_results: list[dict[str, Any]] = Field(default_factory=list)


class ScoreRequest(CamelModel):
    """Score an ad-hoc prospect (used by the extension before it is saved)."""

    lead_id: int | None = None
    campaign_id: int | None = None
    lead: LeadBase | None = None
    persist: bool = False


class ScoreResponse(CamelModel):
    score: int
    raw_score: int
    status: LeadStatus
    rejected: bool
    rejection_reason: str | None = None
    qualified: bool = False
    min_score: int = 70
    reasons: list[dict[str, Any]] = Field(default_factory=list)
    rule_results: list[dict[str, Any]] = Field(default_factory=list)
    tags: list[str] = Field(default_factory=list)
    errors: list[str] = Field(default_factory=list)


class ConnectionStatusUpdate(CamelModel):
    status: ConnectionStatus


class BulkLeadAction(CamelModel):
    lead_ids: list[int] = Field(default_factory=list)
    campaign_id: int | None = None
