from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import APIRouter, HTTPException, Depends, Request
from src.repo.module.ModuleRepo import ModuleRepo
from src.request.module.ModuleRequest import ModuleResponse, ModuleCreateRequest, ModuleUpdateRequest, ModuleWithProject, ModuleDDLReponse
from typing import List
from src.util.jw import verify_jwt
from src.repo.engine import get_db

class ModuleRouter:
    def __init__(self, repo: ModuleRepo = Depends(ModuleRepo)):
     
        self.router = APIRouter(prefix="/module", dependencies=[Depends(verify_jwt)])
        self.router.add_api_route("/by-project", self.get_modules_by_project, methods=["GET"], response_model=List[ModuleWithProject])   
        self.router.add_api_route("/ddl", self.get_module_ddl, methods=["GET"], response_model=List[ModuleDDLReponse])   
        self.router.add_api_route("/", self.index, methods=["GET"], response_model=List[ModuleResponse])
        self.router.add_api_route("/", self.create, methods=["POST"], response_model=ModuleResponse)
        self.router.add_api_route("/{id}", self.find, methods=["GET"], response_model=ModuleResponse)
        self.router.add_api_route("/{id}", self.update, methods=["PUT"], response_model=ModuleResponse)       
    
                
    async def index(self,db:AsyncSession=Depends(get_db)):
        repo=ModuleRepo(db)
        records = await repo.readAll()
        return records

    async def create(self, data:ModuleCreateRequest,request:Request,db:AsyncSession=Depends(get_db)):       
        user_id = int(request.state.decoded_token.get("sub"))
        repo = ModuleRepo(db)
        records = await repo.create(
            data,
            user_id
        )
        return records

    async def find(self, id: int, db:AsyncSession=Depends(get_db)):
        crud=ModuleRepo(db)
        record= await crud.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: ModuleUpdateRequest,request:Request,db:AsyncSession=Depends(get_db)):       
        user_id = int(request.state.decoded_token.get("sub"))
        crud=ModuleRepo(db)
        db_project=await crud.update(id,update_data,user_id)
        if not db_project:
             raise HTTPException(status_code=404,detail="Member Not Found")
        return db_project
    
    async def get_modules_by_project(self, project_id: int, db:AsyncSession=Depends(get_db)):
        repo = ModuleRepo(db)
        return await repo.get_modules_by_project(project_id)
    
    async def get_module_ddl(self, project_id: int, db:AsyncSession=Depends(get_db)):
        repo = ModuleRepo(db)
        return await repo.get_module_ddl(project_id)        