import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Scanner;

/**
 * Titik masuk aplikasi catatan tugas versi ketiga:
 * daftar dimuat dari berkas saat mulai dan disimpan setiap kali berubah.
 */
public class AplikasiTugas {

    private static final Path BERKAS_DATA = Path.of("tugas.txt");

    public static void main(String[] args) {
        PenyimpananTugas penyimpanan = new PenyimpananTugas(BERKAS_DATA);
        DaftarTugas daftar = new DaftarTugas();

        if (Files.exists(BERKAS_DATA)) {
            try {
                daftar = penyimpanan.muat();
                System.out.println("Memuat " + daftar.semua().size()
                        + " tugas dari " + BERKAS_DATA + ".");
            } catch (IOException e) {
                System.out.println("Gagal memuat " + BERKAS_DATA + ": "
                        + e.getMessage());
                System.out.println("Meneruskan dengan daftar kosong.");
            }
        } else {
            System.out.println("Belum ada berkas " + BERKAS_DATA
                    + "; mulai dari daftar kosong.");
        }

        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);
                        simpan(penyimpanan, daftar);
                    }
                    case "2" -> tampilkanDaftar(daftar);
                    case "3" -> {
                        tandaiSelesai(daftar, masukan);
                        simpan(penyimpanan, daftar);
                    }
                    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 simpan(PenyimpananTugas penyimpanan, DaftarTugas daftar) {
        try {
            penyimpanan.simpan(daftar);
            System.out.println("Daftar disimpan ke tugas.txt.");
        } catch (IOException e) {
            System.out.println("Gagal menyimpan tugas.txt: " + e.getMessage());
        }
    }

    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());
        }
    }
}
