from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import APIRouter, HTTPException, Depends
from sqlalchemy.orm import Session
from src.repo.TestTableRepo import TestTableRepo
import logging
from src.request.CreateTestTableRequest import CreateTestTableRequest
from src.util.jw import verify_jwt
from src.repo.engine import get_db


class TestTableRouter:
    def __init__(self, repo: TestTableRepo = Depends(TestTableRepo)):
       
        self.router = APIRouter(prefix="/test-table", dependencies=[Depends(verify_jwt)])
        self.repo = repo
        self.router.add_api_route("/index", self.index, methods=["GET"])
        self.router.add_api_route("/create", self.create, methods=["POST"])
        self.router.add_api_route("/find/{id}", self.find, methods=["GET"])
        self.router.add_api_route("/update/{id}", self.update, methods=["PUT"])
        self.router.add_api_route("/delete/{id}", self.delete, methods=["DELETE"])

    async def index(self, db:AsyncSession=Depends(get_db)):
        records = self.repo.readAll()
        return records

    async def create(self, request: CreateTestTableRequest):
        records = self.repo.create(request.name)
        return records

    async def find(self, id: int):
        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, request: CreateTestTableRequest):
        record = self.repo.find(id)
        if record is not None:
            return self.repo.update(
                record=record, name=request.name
            )
        raise HTTPException(422, f" Record not found for id {id}")

    async def delete(self, id: int):
        record = self.repo.find(id)
        if record is not None:
            return self.repo.delete(record=record)
        raise HTTPException(422, f" Record not found for id {id}")
