import java.util.List;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/** Bagian 3: DemoRetry — pipeline tahan galat dengan retry, jejak, dan laporan galat. */
public class DemoRetry {

    public static void main(String[] args) {
        List<String> isi = DataContoh.isiBerkas();
        HasilPipeline hasil;
        try (ExecutorService eksekutor = Executors.newVirtualThreadPerTaskExecutor()) {
            hasil = Pipeline.jalankanDenganRetry(isi, eksekutor, KebijakanRetry.baku());
        }

        System.out.println("== Pipeline dengan retry (" + isi.size() + " baris) ==");
        System.out.println("baris sah         : " + hasil.jumlahSah());
        System.out.println("ditolak validasi  : " + hasil.jumlahDitolak());
        System.out.println("gagal tetap       : " + hasil.jumlahGagalTetap());
        System.out.println("unit tunggu total : " + hasil.unitTungguTotal() + " unit");
        System.out.println();
        System.out.println("== Jejak percobaan ulang (terurut baris, lalu percobaan) ==");
        for (CatatanPercobaan c : hasil.jejakPercobaan()) {
            System.out.printf(Locale.US, "  baris %2d percobaan %d: %s%n",
                    c.nomorBaris(), c.percobaanKe(), c.kejadian());
        }
        System.out.println();
        System.out.println("== Laporan galat (terurut nomor baris) ==");
        hasil.laporanGalat().forEach(g -> System.out.println("  " + g));
        System.out.println();
        System.out.println("== Ringkasan agregasi (" + hasil.jumlahSah() + " kejadian) ==");
        System.out.println("kota     : " + hasil.jumlahKota());
        System.out.println("kategori : " + hasil.jumlahKategori());
    }
}
