from pydantic import BaseModel, EmailStr
from datetime import datetime


# --- User ---
class UserCreate(BaseModel):
    email: EmailStr
    username: str
    full_name: str
    password: str


class UserLogin(BaseModel):
    email: str
    password: str


class UserOut(BaseModel):
    id: int
    email: str
    username: str
    full_name: str
    bio: str | None = None
    avatar_url: str | None = None
    is_verified: bool = False
    field_id: int | None = None
    created_at: datetime

    model_config = {"from_attributes": True}


class AffiliationCreate(BaseModel):
    designation: str
    institution: str
    department: str | None = None
    is_primary: bool = False
    start_year: int | None = None
    end_year: int | None = None


class AffiliationOut(BaseModel):
    id: int
    designation: str
    institution: str
    department: str | None = None
    is_primary: bool
    start_year: int | None = None
    end_year: int | None = None

    model_config = {"from_attributes": True}


# --- Field ---
class FieldCreate(BaseModel):
    name: str
    description: str | None = None
    icon: str | None = None
    color: str = "#00A651"


class FieldOut(BaseModel):
    id: int
    name: str
    slug: str
    description: str | None = None
    icon: str | None = None
    color: str
    is_active: bool

    model_config = {"from_attributes": True}


# --- Tag ---
class TagOut(BaseModel):
    id: int
    name: str
    slug: str

    model_config = {"from_attributes": True}


# --- Publication ---
class PublicationCreate(BaseModel):
    title: str
    abstract: str | None = None
    content: str | None = None
    doi: str | None = None
    publication_type: str = "article"
    journal: str | None = None
    year: int | None = None
    git_repo_url: str | None = None
    video_url: str | None = None
    field_id: int | None = None
    tags: list[str] = []
    citations: list[str] = []


class PublicationOut(BaseModel):
    id: int
    title: str
    abstract: str | None = None
    doi: str | None = None
    publication_type: str
    journal: str | None = None
    year: int | None = None
    git_repo_url: str | None = None
    video_url: str | None = None
    view_count: int
    citation_count: int
    author_id: int
    field_id: int | None = None
    created_at: datetime

    model_config = {"from_attributes": True}


class CommentCreate(BaseModel):
    content: str
    parent_id: int | None = None


class CommentOut(BaseModel):
    id: int
    content: str
    author_id: int
    parent_id: int | None = None
    created_at: datetime

    model_config = {"from_attributes": True}


# --- Question ---
class QuestionCreate(BaseModel):
    title: str
    body: str
    field_id: int | None = None
    tags: list[str] = []


class QuestionOut(BaseModel):
    id: int
    title: str
    body: str
    author_id: int
    field_id: int | None = None
    is_closed: bool
    view_count: int
    vote_count: int
    answer_count: int
    created_at: datetime

    model_config = {"from_attributes": True}


class AnswerCreate(BaseModel):
    body: str


class AnswerOut(BaseModel):
    id: int
    body: str
    author_id: int
    is_accepted: bool
    vote_count: int
    created_at: datetime

    model_config = {"from_attributes": True}


# --- Job ---
class JobCreate(BaseModel):
    title: str
    description: str
    institution: str
    location: str | None = None
    job_type: str = "full-time"
    salary_range: str | None = None
    application_url: str | None = None
    application_email: str | None = None
    deadline: datetime | None = None
    field_id: int | None = None


class JobOut(BaseModel):
    id: int
    title: str
    description: str
    institution: str
    location: str | None = None
    job_type: str
    salary_range: str | None = None
    deadline: datetime | None = None
    is_active: bool
    posted_by_id: int
    field_id: int | None = None
    created_at: datetime

    model_config = {"from_attributes": True}


class JobApplicationCreate(BaseModel):
    cover_letter: str | None = None


# --- Notification ---
class NotificationOut(BaseModel):
    id: int
    notification_type: str
    message: str
    link: str | None = None
    is_read: bool
    created_at: datetime

    model_config = {"from_attributes": True}


# --- Search ---
class SearchQuery(BaseModel):
    q: str = ""
    field_id: int | None = None
    tag: str | None = None
    author: str | None = None
    year_from: int | None = None
    year_to: int | None = None
    sort: str = "newest"  # newest, oldest, popular
    page: int = 1
    per_page: int = 20
