"""Pengelola Daftar Tugas — program manajemen tugas berbasis terminal."""

import storage

NAMA_BERKAS = "tugas.json"


def tampilkan_menu() -> None:
    print("=== Pengelola Daftar Tugas ===")
    print("1. Tambah tugas")
    print("2. Daftar tugas")
    print("3. Tandai selesai")
    print("4. Hapus tugas")
    print("5. Keluar")


def nomor_id_baru(daftar_tugas: list[dict]) -> int:
    if not daftar_tugas:
        return 1
    return max(tugas["id"] for tugas in daftar_tugas) + 1


def tambah_tugas(daftar_tugas: list[dict], judul: str) -> dict:
    tugas_baru = {"id": nomor_id_baru(daftar_tugas), "judul": judul, "selesai": False}
    daftar_tugas.append(tugas_baru)
    return tugas_baru


def tampilkan_daftar(daftar_tugas: list[dict]) -> None:
    if not daftar_tugas:
        print("Belum ada tugas.")
        return

    for tugas in daftar_tugas:
        penanda = "[x]" if tugas["selesai"] else "[ ]"
        print(f"{penanda} {tugas['id']}. {tugas['judul']}")


def baca_nomor() -> int | None:
    try:
        return int(input("Nomor tugas: ").strip())
    except ValueError:
        print("Nomor tugas harus berupa angka.")
        return None


def tandai_selesai(daftar_tugas: list[dict], nomor: int) -> bool:
    for tugas in daftar_tugas:
        if tugas["id"] == nomor:
            tugas["selesai"] = True
            return True
    return False


def hapus_tugas(daftar_tugas: list[dict], nomor: int) -> dict | None:
    for indeks, tugas in enumerate(daftar_tugas):
        if tugas["id"] == nomor:
            return daftar_tugas.pop(indeks)
    return None


def main() -> None:
    daftar_tugas = storage.muat_tugas(NAMA_BERKAS)
    if daftar_tugas:
        print(f"{len(daftar_tugas)} tugas dimuat dari {NAMA_BERKAS}.")

    while True:
        tampilkan_menu()
        pilihan = input("Pilihan: ").strip()

        if pilihan == "1":
            judul = input("Judul tugas: ").strip()
            if judul:
                tugas_baru = tambah_tugas(daftar_tugas, judul)
                print(f"Tugas \"{tugas_baru['judul']}\" tersimpan dengan id {tugas_baru['id']}.")
                storage.simpan_tugas(daftar_tugas, NAMA_BERKAS)
            else:
                print("Judul tugas tidak boleh kosong.")
        elif pilihan == "2":
            tampilkan_daftar(daftar_tugas)
        elif pilihan == "3":
            nomor = baca_nomor()
            if nomor is not None:
                if tandai_selesai(daftar_tugas, nomor):
                    print(f"Tugas {nomor} ditandai selesai.")
                    storage.simpan_tugas(daftar_tugas, NAMA_BERKAS)
                else:
                    print(f"Tugas dengan nomor {nomor} tidak ditemukan.")
        elif pilihan == "4":
            nomor = baca_nomor()
            if nomor is not None:
                dihapus = hapus_tugas(daftar_tugas, nomor)
                if dihapus is not None:
                    print(f"Tugas \"{dihapus['judul']}\" dihapus.")
                    storage.simpan_tugas(daftar_tugas, NAMA_BERKAS)
                else:
                    print(f"Tugas dengan nomor {nomor} tidak ditemukan.")
        elif pilihan == "5":
            print("Sampai jumpa!")
            break
        else:
            print("Pilihan tidak dikenal.")


if __name__ == "__main__":
    main()
