from pydantic import BaseModel, Field
from typing import Optional, List, Any
from datetime import datetime


# ─── Task Schemas ─────────────────────────────────────────────────────────────

class TaskCreate(BaseModel):
    user_request: str = Field(..., description="Natural language description of what to build/fix")
    repo_path: str = Field(..., description="Absolute path to the target repository")
    executor: str = Field(default="claude", description="Executor: claude | codex | openhands | gemini")
    graph_type: str = Field(default="engineering", description="Workflow: engineering | bugfix | review | release")
    project_id: Optional[str] = None
    max_attempts: int = Field(default=3, ge=1, le=10)


class TaskResponse(BaseModel):
    task_id: str
    status: str
    user_request: str
    repo_path: str
    executor: str
    graph_type: str
    created_at: str
    message: str = ""


class TaskStatus(BaseModel):
    task_id: str
    status: str
    attempts: int
    current_node: Optional[str] = None
    code_result: Optional[dict] = None
    test_result: Optional[dict] = None
    review_result: Optional[dict] = None
    diff_result: Optional[dict] = None
    error: Optional[str] = None


# ─── Report Schemas ───────────────────────────────────────────────────────────

class ReportResponse(BaseModel):
    task_id: str
    report: str
    pr_description: str
    test_summary: Optional[dict] = None
    review_summary: Optional[dict] = None
    diff_summary: Optional[dict] = None


# ─── Project Schemas ──────────────────────────────────────────────────────────

class ProjectCreate(BaseModel):
    name: str
    repo_path: str
    description: str = ""


class ProjectResponse(BaseModel):
    project_id: str
    name: str
    repo_path: str
    description: str
    created_at: str
    task_count: int = 0


# ─── Executor Health ──────────────────────────────────────────────────────────

class ExecutorHealth(BaseModel):
    name: str
    available: bool
    details: str = ""
