from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import APIRouter, HTTPException, Depends, Request
from src.repo.member.MemberRepo import MemberRepo
from src.request.member.MemberRequest import MemberResponse, MemberCreateRequest, MemberUpdateRequest, MemberWithProject, MemberDDLReponse
from typing import List
from src.util.jw import verify_jwt
from src.repo.engine import get_db

class MemberRouter:
    def __init__(self, repo: MemberRepo = Depends(MemberRepo)):
     
        self.router = APIRouter(prefix="/member", dependencies=[Depends(verify_jwt)])
        self.router.add_api_route("/by-project", self.get_members_by_project, methods=["GET"], response_model=List[MemberWithProject])           
        self.router.add_api_route("/ddl", self.get_members_ddl, methods=["GET"], response_model=List[MemberDDLReponse])           

        self.router.add_api_route("/", self.index, methods=["GET"], response_model=List[MemberResponse])
        self.router.add_api_route("/", self.create, methods=["POST"], response_model=MemberResponse)
        self.router.add_api_route("/{id}", self.find, methods=["GET"], response_model=MemberResponse)
        self.router.add_api_route("/{id}", self.update, methods=["PUT"], response_model=MemberResponse)       
       
    async def index(self,db:AsyncSession=Depends(get_db)):
        repo=MemberRepo(db)
        records = await repo.readAll()
        return records

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

    async def find(self, id: int, db:AsyncSession=Depends(get_db)):
        crud=MemberRepo(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: MemberUpdateRequest,request:Request,db:AsyncSession=Depends(get_db)):       
        user_id = int(request.state.decoded_token.get("sub"))
        crud=MemberRepo(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_members_by_project(self, project_id: int, db:AsyncSession=Depends(get_db)):
        repo = MemberRepo(db)
        return await repo.get_members_by_project(project_id)
    
    async def get_members_ddl(self, project_id: int, db:AsyncSession=Depends(get_db)):
        repo = MemberRepo(db)
        return await repo.get_members_ddl(project_id)    