import java.time.LocalDate;
import java.util.List;

/**
 * Titik masuk inti telanjang Bagian 1: perakit seluruh lapisan secara manual
 * lewat constructor injection, lalu menggiring beberapa operasi lewat layanan
 * untuk membuktikan bahwa lapisan tersambung dan penolakan aturan bisnis
 * tidak menghentikan program. Lapisan web (HTTP) menyusul di Bagian 2.
 */
public class AplikasiWeb {

    public static void main(String[] args) {
        System.out.println("=== AplikasiWeb: perakitan lapisan secara manual ===");
        RepositoryTugasWeb repository = new RepositoryTugasWebMemori();
        LayananTugasWeb layanan = new LayananTugasWeb(repository, LocalDate.of(2026, 1, 15));
        System.out.println("[Perakit] RepositoryTugasWebMemori dibuat");
        System.out.println("[Perakit] LayananTugasWeb dibuat; repository dan hari"
                + " operasional 2026-01-15 disuntik lewat konstruktor");

        System.out.println();
        System.out.println("=== Tiga tugas baru lewat layanan ===");
        layanan.buat(new PermintaanTugas("Belajar arsitektur berlapis", "Budi", "2026-02-01"));
        layanan.buat(new PermintaanTugas("Menulis dokumentasi API", "Siti", "2026-01-20"));
        layanan.buat(new PermintaanTugas("Riset keamanan aplikasi web", "Dewi", "2026-01-25"));
        for (TugasWeb tugas : layanan.daftar()) {
            System.out.println(tugas.formatRingkas());
        }

        System.out.println();
        System.out.println("=== Transisi status lewat layanan ===");
        TugasWeb selesai = layanan.tandaiSelesai(2);
        System.out.println(selesai.formatRingkas());

        System.out.println();
        System.out.println("=== Penolakan yang tetap sopan ===");
        try {
            layanan.tandaiSelesai(2);
        } catch (AturanBisnisException e) {
            System.out.println("Ditolak " + e.status() + ": " + e.getMessage());
        }
        try {
            layanan.cari(99);
        } catch (TugasTidakDitemukanException e) {
            System.out.println("Ditolak " + e.status() + ": " + e.getMessage());
        }

        System.out.println();
        System.out.println("=== Ubah dan hapus ===");
        TugasWeb revisi = layanan.ubah(1, new PermintaanTugas(
                "Belajar arsitektur berlapis (revisi)", "Budi", "2026-02-08"));
        System.out.println(revisi.formatRingkas());
        layanan.hapus(3);
        List<TugasWeb> sisa = layanan.daftar();
        System.out.println("Setelah hapus #3, tersisa " + sisa.size() + " tugas");
        for (TugasWeb tugas : sisa) {
            System.out.println(tugas.formatRingkas());
        }
    }
}
