from fastapi import APIRouter, Depends, HTTPException, status, Request
from sqlalchemy.orm import Session
from utils.get_db import get_db
from services.projects_service import all_projects_of_org,create_project_for_org,update_project_for_org, delete_project_for_org, get_project_by_id
from schema.project_schema import ProjectCreateRequestSchema, ProjectResponseSchema,ProjectListResponseSchema,ProjectUpdateRequestSchema
from uuid import UUID
from typing import Optional

project_router = APIRouter()

@project_router.get("",status_code=status.HTTP_200_OK, response_model=ProjectListResponseSchema)
def get_projects(
    request:Request,
    page: int = 1,
    page_size: int = 10,
    search: str = None,
    sort_by: str = "created_at",
    sort_order: str = "desc",
    status: Optional[str] = None,
    db: Session = Depends(get_db)
):
    return all_projects_of_org(request, db, page=page, page_size=page_size, search=search, sort_by=sort_by, sort_order=sort_order, status=status)

@project_router.get("/{project_id}", response_model=ProjectResponseSchema, status_code=status.HTTP_200_OK)
def get_project(project_id: UUID, request: Request, db: Session = Depends(get_db)):
    return get_project_by_id(project_id, request, db)

@project_router.post("/create-project",response_model=ProjectResponseSchema, status_code=status.HTTP_201_CREATED)
def create_project(request:Request,payload:ProjectCreateRequestSchema, db: Session = Depends(get_db)):
    print(f"Received request to create project with name: {payload.name} for organization ID: {payload.org_id}")
    return create_project_for_org(request,payload,db)

@project_router.patch("/update-project/{project_id}",response_model=ProjectResponseSchema, status_code=status.HTTP_200_OK)
def update_project(project_id:UUID,request:Request,payload:ProjectUpdateRequestSchema, db: Session = Depends(get_db)):
    print(f"Received request to update project with ID: {project_id}")
    return update_project_for_org(project_id,request,payload,db)


@project_router.delete("/delete-project/{project_id}",response_model=ProjectResponseSchema, status_code=status.HTTP_200_OK)
def delete_project(project_id:UUID,request:Request, db: Session = Depends(get_db)):
    return delete_project_for_org(project_id,request,db)