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

/** Bagian 2: paralel vs sekuensial — hasil harus identik, urutan tetap terjaga. */
public class DemoPipeline {

    public static void main(String[] args) {
        List<String> isi = DataContoh.isiBerkas();
        HasilPipeline sekuensial = Pipeline.jalankanSekuensial(isi);

        HasilPipeline paralelPool;
        try (ExecutorService eksekutor = Executors.newFixedThreadPool(4)) {
            paralelPool = Pipeline.jalankanParalel(isi, eksekutor);
        }

        HasilPipeline paralelVirtual;
        try (ExecutorService eksekutor = Executors.newVirtualThreadPerTaskExecutor()) {
            paralelVirtual = Pipeline.jalankanParalel(isi, eksekutor);
        }

        System.out.println("== Perbandingan eksekusi pipeline (" + isi.size() + " baris) ==");
        ringkas("sekuensial             ", sekuensial);
        ringkas("paralel pool tetap 4   ", paralelPool);
        ringkas("paralel virtual thread ", paralelVirtual);
        System.out.println();
        System.out.println("hasil identik (sekuensial vs pool tetap) : "
                + sekuensial.equals(paralelPool));
        System.out.println("hasil identik (sekuensial vs virtual)    : "
                + sekuensial.equals(paralelVirtual));
        System.out.println("urutan laporan sama baris demi baris     : "
                + sekuensial.laporan().equals(paralelVirtual.laporan()));
    }

    private static void ringkas(String label, HasilPipeline hasil) {
        System.out.println(label + ": sah " + hasil.jumlahSah() + ", ditolak "
                + hasil.jumlahDitolak() + ", laporan " + hasil.laporan().size() + " baris");
    }
}
