"""Schemas for project template API endpoints.""" from typing import Optional, List, Any from datetime import datetime from pydantic import BaseModel, Field class TaskStatusDefinition(BaseModel): """Task status definition for templates.""" name: str = Field(..., min_length=1, max_length=50) color: str = Field(default="#808080", pattern=r"^#[0-9A-Fa-f]{6}$") position: int = Field(default=0, ge=0) is_done: bool = Field(default=False) class CustomFieldDefinition(BaseModel): """Custom field definition for templates.""" name: str = Field(..., min_length=1, max_length=100) field_type: str = Field(..., pattern=r"^(text|number|dropdown|date|person|formula)$") options: Optional[List[str]] = None formula: Optional[str] = None is_required: bool = Field(default=False) position: int = Field(default=0, ge=0) class ProjectTemplateBase(BaseModel): """Base schema for project template.""" name: str = Field(..., min_length=1, max_length=200) description: Optional[str] = None is_public: bool = Field(default=False) task_statuses: Optional[List[TaskStatusDefinition]] = None custom_fields: Optional[List[CustomFieldDefinition]] = None default_security_level: Optional[str] = Field( default="department", pattern=r"^(public|department|confidential)$" ) class ProjectTemplateCreate(ProjectTemplateBase): """Schema for creating a project template.""" pass class ProjectTemplateUpdate(BaseModel): """Schema for updating a project template.""" name: Optional[str] = Field(None, min_length=1, max_length=200) description: Optional[str] = None is_public: Optional[bool] = None task_statuses: Optional[List[TaskStatusDefinition]] = None custom_fields: Optional[List[CustomFieldDefinition]] = None default_security_level: Optional[str] = Field( None, pattern=r"^(public|department|confidential)$" ) class ProjectTemplateResponse(ProjectTemplateBase): """Schema for project template response.""" id: str owner_id: str is_active: bool created_at: datetime updated_at: datetime class Config: from_attributes = True class ProjectTemplateWithOwner(ProjectTemplateResponse): """Project template response with owner details.""" owner_name: Optional[str] = None class ProjectTemplateListResponse(BaseModel): """Response schema for listing project templates.""" templates: List[ProjectTemplateWithOwner] total: int class CreateProjectFromTemplateRequest(BaseModel): """Request schema for creating a project from a template.""" template_id: str title: str = Field(..., min_length=1, max_length=500) description: Optional[str] = Field(None, max_length=10000) space_id: str department_id: Optional[str] = None class CreateProjectFromTemplateResponse(BaseModel): """Response schema for project created from template.""" id: str title: str template_id: str template_name: str task_statuses_created: int custom_fields_created: int