"""Outreach task, reply, import and settings schemas."""

from __future__ import annotations

from datetime import date, datetime
from typing import Any

from pydantic import Field

from app.models.enums import ReplyStatus, TaskStatus, TaskType
from app.schemas.base import CamelModel


class TaskLeadSummary(CamelModel):
    id: int
    full_name: str
    job_title: str | None = None
    company: str | None = None
    industry: str | None = None
    location: str | None = None
    profile_url: str | None = None
    score: int = 0
    status: str = "cold"
    connection_status: str = "not_connected"
    reply_status: str = "no_reply"


class OutreachTaskBase(CamelModel):
    task_type: TaskType = TaskType.CONNECTION_REQUEST
    status: TaskStatus = TaskStatus.PENDING
    suggested_message: str | None = None
    edited_message: str | None = None
    reason: str | None = None
    scheduled_date: date
    notes: str | None = None


class OutreachTaskCreate(CamelModel):
    lead_id: int
    campaign_id: int | None = None
    task_type: TaskType = TaskType.CONNECTION_REQUEST
    scheduled_date: date | None = None
    reason: str | None = None
    generate_message: bool = True


class OutreachTaskUpdate(CamelModel):
    status: TaskStatus | None = None
    edited_message: str | None = None
    scheduled_date: date | None = None
    notes: str | None = None
    reason: str | None = None


class OutreachTaskRead(OutreachTaskBase):
    id: int
    lead_id: int
    campaign_id: int | None = None
    template_id: int | None = None
    campaign_name: str | None = None
    sequence_index: int = 0
    final_message: str | None = None
    approved_at: datetime | None = None
    completed_at: datetime | None = None
    created_at: datetime
    updated_at: datetime
    lead: TaskLeadSummary | None = None


class TaskActionRequest(CamelModel):
    notes: str | None = None
    message: str | None = None


class BulkTaskAction(CamelModel):
    task_ids: list[int] = Field(default_factory=list)
    action: str = "approve"
    notes: str | None = None


class GenerateTasksRequest(CamelModel):
    campaign_id: int
    only_qualified: bool = True


class ReplyCreate(CamelModel):
    lead_id: int
    task_id: int | None = None
    reply_type: ReplyStatus = ReplyStatus.REPLIED
    content: str | None = None


class ReplyRead(CamelModel):
    id: int
    lead_id: int
    task_id: int | None = None
    campaign_id: int | None = None
    reply_type: ReplyStatus
    content: str | None = None
    received_at: datetime
    lead_name: str | None = None


class ImportPreviewRow(CamelModel):
    lead_id: int | 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 = None
    profile_url: str | None = None
    status: str
    note: str
    score: int | None = None


class ImportResultRead(CamelModel):
    total_rows: int
    imported: int
    updated: int
    duplicates: int
    failed: int
    errors: list[dict[str, Any]] = Field(default_factory=list)
    preview: list[ImportPreviewRow] = Field(default_factory=list)
    lead_ids: list[int] = Field(default_factory=list)
    unknown_headers: list[str] = Field(default_factory=list)
    history_id: int | None = None


class ImportHistoryRead(CamelModel):
    id: int
    filename: str
    campaign_id: int | None = None
    total_rows: int
    imported: int
    updated: int
    duplicates: int
    failed: int
    errors: list[dict[str, Any]] = Field(default_factory=list)
    created_at: datetime


class JsonImportRequest(CamelModel):
    """Used by the extension and by 'paste CSV' in the dashboard."""

    campaign_id: int | None = None
    rows: list[dict[str, Any]] = Field(default_factory=list)
    csv_text: str | None = None
    filename: str = "manual-import.csv"
    update_existing: bool = False
    dry_run: bool = False


class UserSettings(CamelModel):
    name: str = "LeadPilot User"
    email: str | None = None
    company: str | None = None
    job_title: str | None = None
    calendar_link: str | None = None


class UserSettingsRead(UserSettings):
    id: int


class AppSettings(CamelModel):
    default_campaign_id: int | None = None
    followup_days: list[int] = Field(default_factory=lambda: [3, 7, 14])
    app_name: str = "LeadPilot"
    version: str = "1.0.0"
