import sqlite3

from fastapi import Depends, FastAPI, status

from app.database import dapatkan_koneksi
from app.models import TugasBuat, TugasTampil

app = FastAPI(title="API Manajemen Tugas", version="0.3.0")


def baris_ke_tugas(baris: sqlite3.Row) -> dict:
    return {
        "id": baris["id"],
        "judul": baris["judul"],
        "selesai": bool(baris["selesai"]),
    }


@app.get("/health")
def health() -> dict[str, str]:
    return {"status": "ok"}


@app.get("/tugas", response_model=list[TugasTampil])
def daftar_tugas(koneksi: sqlite3.Connection = Depends(dapatkan_koneksi)) -> list[dict]:
    baris_semua = koneksi.execute(
        "SELECT id, judul, selesai FROM tugas ORDER BY id"
    ).fetchall()
    return [baris_ke_tugas(baris) for baris in baris_semua]


@app.post("/tugas", response_model=TugasTampil, status_code=status.HTTP_201_CREATED)
def buat_tugas(
    payload: TugasBuat, koneksi: sqlite3.Connection = Depends(dapatkan_koneksi)
) -> dict:
    with koneksi:
        kursor = koneksi.execute(
            "INSERT INTO tugas (judul, selesai) VALUES (?, ?)",
            (payload.judul, 0),
        )
    baris = koneksi.execute(
        "SELECT id, judul, selesai FROM tugas WHERE id = ?",
        (kursor.lastrowid,),
    ).fetchone()
    return baris_ke_tugas(baris)


@app.get("/tugas/{tugas_id}", response_model=TugasTampil)
def ambil_tugas(
    tugas_id: int, koneksi: sqlite3.Connection = Depends(dapatkan_koneksi)
) -> dict:
    baris = koneksi.execute(
        "SELECT id, judul, selesai FROM tugas WHERE id = ?",
        (tugas_id,),
    ).fetchone()
    if baris is None:
        raise LookupError(f"tugas dengan id {tugas_id} tidak ditemukan")
    return baris_ke_tugas(baris)


@app.delete("/tugas/{tugas_id}", status_code=status.HTTP_204_NO_CONTENT)
def hapus_tugas(
    tugas_id: int, koneksi: sqlite3.Connection = Depends(dapatkan_koneksi)
) -> None:
    with koneksi:
        kursor = koneksi.execute(
            "DELETE FROM tugas WHERE id = ?",
            (tugas_id,),
        )
    if kursor.rowcount == 0:
        raise LookupError(f"tugas dengan id {tugas_id} tidak ditemukan")
