from pydantic import BaseModel, Field
from datetime import date, datetime
from typing import List, Optional
from enum import Enum

class TaskPriority(str, Enum):
    low = "Low"
    medium = "Medium"
    high = "High"

class TaskStatus(str, Enum):
    INPROGRESS = "InProgress"
    COMPLETED = "Completed"
    NEW = "New"
    
class TaskBase(BaseModel):
    module_id: int = None
    title: str = None
    start_date: Optional[date] = None
    end_date: Optional[date] = None
    status: Optional[TaskStatus] = None 
    priority: Optional[TaskPriority] = None         
    description: Optional[str] = None
    is_active: Optional[bool] = True

class TaskAssignedMemberBase(BaseModel):
    task_id: Optional[int] = None
    hrms_user_id: Optional[int] = None
    is_active: Optional[bool] = True

class TaskAssignedMemberCreateRequest(TaskAssignedMemberBase):    
    pass 
    #hrms_user_id:int    

class TaskAssignedMemberUpdateRequest(TaskAssignedMemberBase):
    pass

class TaskCreateRequest(TaskBase):
    module_id:int
    title: str
    description: str
    status:TaskStatus
    priority:TaskPriority
    assigned_members: List[TaskAssignedMemberCreateRequest] = []

class TaskUpdateRequest(TaskBase):
    pass
    assigned_members: Optional[List[TaskAssignedMemberUpdateRequest]] = None    

class TaskAssignedMemberResponse(TaskAssignedMemberCreateRequest):
    id: int
    task_id: int        
    created_at: datetime
    updated_at: datetime
    created_by: Optional[int] = None
    updated_by: Optional[int] = None
    created_by_name: Optional[str] = None
    updated_by_name: Optional[str] = None
    
class TaskResponse(TaskCreateRequest):
    id: int
    created_at: datetime
    updated_at: datetime
    created_by: Optional[int] = None
    updated_by: Optional[int] = None
    created_by_name: Optional[str] = None
    updated_by_name: Optional[str] = None
    assigned_members: List[TaskAssignedMemberResponse] = []    
    

########    

class AssignedMemberResponse(BaseModel):
    am_id: int
    am_user_id: int
    am_name: str

class TaskMemberResponse(BaseModel):
    task_id: int
    task_name: str
    task_description: str
    task_priority: str
    task_status: str  
    task_start_date: date
    task_end_date: date
    assigned_members: List[AssignedMemberResponse] = []
    
class ModuleTaskResponse(BaseModel):
    module_id: int
    module_name: str
    tasks: List[TaskMemberResponse] = []
    
class ProjectModelMemeberTaskResponse(BaseModel):
    project_id: int
    project_name: str
    modules: List[ModuleTaskResponse] = []
        