from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import APIRouter, HTTPException, Depends, Request
from src.repo.project.ProjectRepo import ProjectRepo
from src.request.project.ProjectRequest import ProjectResponse, ProjectCreateRequest, ProjectUpdateRequest, ProjectDDL
from typing import List
from src.util.jw import verify_jwt
from src.repo.engine import get_db

class ProjectRouter:
    def __init__(self):
     
        self.router = APIRouter(prefix="/project", dependencies=[Depends(verify_jwt)])
        self.router.add_api_route("/ddl", self.id_name, methods=["GET"], response_model=List[ProjectDDL])           
        self.router.add_api_route("/", self.create, methods=["POST"], response_model=ProjectResponse)
        self.router.add_api_route("/", self.index, methods=["GET"], response_model=List[ProjectResponse])
        self.router.add_api_route("/{id}", self.find, methods=["GET"], response_model=ProjectResponse)
        self.router.add_api_route("/{id}", self.update, methods=["PUT"], response_model=ProjectResponse)
        
    async def index(self,db:AsyncSession=Depends(get_db)):
        repo=ProjectRepo(db)
        records = await repo.readAll()
        return records
    
    async def create(self, project:ProjectCreateRequest,request:Request,db:AsyncSession=Depends(get_db)):       
        user_id = int(request.state.decoded_token.get("sub"))
        repo = ProjectRepo(db)
        records = await repo.create(
            project,
            user_id
        )
        return records

    async def find(self, id: int, db:AsyncSession=Depends(get_db)):
        crud=ProjectRepo(db)
        record= await crud.find(id)
        #record = self.repo.find(id)
        if record is not None:
            return record
        raise HTTPException(422, f" Record not found for id {id}")

    async def update(self, id: int, update_data: ProjectUpdateRequest,request:Request,db:AsyncSession=Depends(get_db)):       
        user_id = int(request.state.decoded_token.get("sub"))
        crud=ProjectRepo(db)
        db_project=await crud.update(id,update_data,user_id)
        if not db_project:
             raise HTTPException(status_code=404,detail="Project Not Found")
        return db_project
    
    async def id_name(self,db:AsyncSession=Depends(get_db)):
        repo=ProjectRepo(db)
        records = await repo.readAll()
        return records    