from datetime import datetime
from typing import Any

from pydantic import BaseModel, Field


class TaskCreate(BaseModel):
    title: str
    description: str
    content: str
    task_type: str
    priority: str | None = 'medium'
    deadline: datetime | None = None
    assigned_to: int | None = None
    created_by: int | None = None
    meta_data: dict[str, Any] | None = None

class TaskUpdate(BaseModel):
    status: str | None = None
    assigned_to: int | None = None
    priority: str | None = None

class TaskResponse(BaseModel):
    id: int
    title: str
    description: str | None
    content: str
    task_type: str
    status: str
    priority: str
    deadline: str | None
    assigned_to: int | None
    assigned_by: int | None
    created_by: int | None
    completed_at: str | None
    reviewed_at: str | None
    reviewed_by: int | None
    quality_score: float | None
    approved: bool | None
    reviewer_feedback: str | None
    annotation_data: dict[str, Any] | None
    meta_data: dict[str, Any]
    created_at: str | None
    updated_at: str | None

    class Config:
        from_attributes = True

class AnnotationCreate(BaseModel):
    task_id: int
    annotation_data: dict[str, Any]

class AnnotationResponse(BaseModel):
    id: int
    task_id: int
    annotator_id: int
    annotation_data: dict[str, Any]
    status: str
    quality_score: float | None
    created_at: str | None

    class Config:
        from_attributes = True

class TaskReview(BaseModel):
    quality_score: float = Field(..., ge=0, le=1)
    feedback: str
    approved: bool = True

class BatchAssignItem(BaseModel):
    task_id: int
    assigned_to: int

class BatchAssignResponse(BaseModel):
    assigned: list[BatchAssignItem]

class BatchReviewRequest(BaseModel):
    task_ids: list[int]
    quality_score: float = Field(..., ge=0, le=1)
    feedback: str
    approved: bool = True

class WorkloadAssignRequest(BaseModel):
    task_ids: list[int]
    reviewer_ids: list[int]

class ReviewAnalyticsResponse(BaseModel):
    quality_metrics: dict[str, Any]
    efficiency_metrics: dict[str, Any]
    reviewer_ranking: list[dict[str, Any]]
    distribution: dict[str, Any]
