import java.util.List;
import java.util.Scanner;

/**
 * Titik masuk aplikasi catatan tugas versi kedua:
 * menu utama dengan validasi masukan dan penanganan exception.
 */
public class AplikasiTugas {

    public static void main(String[] args) {
        DaftarTugas daftar = new DaftarTugas();
        Scanner masukan = new Scanner(System.in);
        boolean berjalan = true;

        System.out.println("=== Aplikasi Catatan Tugas ===");

        while (berjalan) {
            tampilkanMenu();
            String pilihan = masukan.nextLine().strip();
            try {
                switch (pilihan) {
                    case "1" -> tambahTugas(daftar, masukan);
                    case "2" -> tampilkanDaftar(daftar);
                    case "3" -> tandaiSelesai(daftar, masukan);
                    case "0" -> {
                        berjalan = false;
                        System.out.println("Sampai jumpa!");
                    }
                    default -> System.out.println(
                            "Pilihan tidak dikenal: " + pilihan);
                }
            } catch (MasukanInvalidException | TugasTidakDitemukanException e) {
                System.out.println("Masukan ditolak: " + e.getMessage());
            }
        }
    }

    private static void tambahTugas(DaftarTugas daftar, Scanner masukan)
            throws MasukanInvalidException {
        System.out.print("Judul tugas: ");
        Tugas tugas = daftar.tambah(masukan.nextLine());
        System.out.println("Tugas ditambahkan: " + tugas.formatBaris());
    }

    private static void tandaiSelesai(DaftarTugas daftar, Scanner masukan)
            throws MasukanInvalidException, TugasTidakDitemukanException {
        System.out.print("Id tugas: ");
        Tugas tugas = daftar.tandaiSelesai(masukan.nextLine());
        System.out.println("Tugas ditandai selesai: " + tugas.formatBaris());
    }

    private static void tampilkanMenu() {
        System.out.println();
        System.out.println("Menu:");
        System.out.println("1. Tambah tugas");
        System.out.println("2. Lihat daftar tugas");
        System.out.println("3. Tandai tugas selesai");
        System.out.println("0. Keluar");
        System.out.print("Pilihan: ");
    }

    private static void tampilkanDaftar(DaftarTugas daftar) {
        System.out.println();
        List<Tugas> semua = daftar.semua();
        if (semua.isEmpty()) {
            System.out.println("Belum ada tugas.");
            return;
        }
        System.out.println("Daftar tugas:");
        for (Tugas tugas : semua) {
            System.out.println(tugas.formatBaris());
        }
    }
}
