import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.AtomicMoveNotSupportedException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;

public class ProsesPeserta {
    public static void main(String[] args) {
        Path sumber = Path.of("peserta.csv");
        Path hasil = Path.of("ringkasan.csv");
        Path sementara = Path.of("ringkasan.tmp");

        int batas = bacaBatas();

        List<String> valid = new ArrayList<>();
        List<String> ditolak = new ArrayList<>();
        try (BufferedReader pembaca =
                     Files.newBufferedReader(sumber, StandardCharsets.UTF_8)) {
            pembaca.readLine(); // buang baris judul kolom
            String baris;
            while ((baris = pembaca.readLine()) != null) {
                if (baris.isBlank()) {
                    continue; // baris kosong diabaikan diam-diam
                }
                String[] kolom = baris.split(",");
                try {
                    int skor = Integer.parseInt(kolom[1].trim());
                    if (skor < 0) {
                        ditolak.add(baris);
                    } else {
                        valid.add(baris);
                    }
                } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
                    ditolak.add(baris);
                }
            }
        } catch (NoSuchFileException e) {
            System.out.println("sumber hilang : " + e.getFile());
            return;
        } catch (IOException e) {
            System.out.println("baca gagal    : " + e.getClass().getSimpleName());
            return;
        }

        System.out.println("konfigurasi   : batas=" + batas);
        System.out.println("valid         : " + valid.size());
        System.out.println("ditolak       : " + ditolak.size());

        try (BufferedWriter penulis =
                     Files.newBufferedWriter(sementara, StandardCharsets.UTF_8)) {
            penulis.write("nama,score,hasil\n");
            for (String baris : valid) {
                String[] kolom = baris.split(",");
                int skor = Integer.parseInt(kolom[1].trim());
                String keputusan = skor >= batas ? "lulus" : "ulang";
                penulis.write(kolom[0] + "," + skor + "," + keputusan + "\n");
            }
        } catch (IOException e) {
            System.out.println("tulis gagal   : " + e.getClass().getSimpleName());
            return;
        }

        // Pasang hasil secara atomik; jatuh ke cadangan bila tidak didukung.
        try {
            Files.move(sementara, hasil, StandardCopyOption.ATOMIC_MOVE);
            System.out.println("pasang        : ATOMIC_MOVE");
        } catch (AtomicMoveNotSupportedException e) {
            try {
                Files.move(sementara, hasil, StandardCopyOption.REPLACE_EXISTING);
                System.out.println("pasang        : fallback REPLACE_EXISTING");
            } catch (IOException e2) {
                System.out.println("pasang gagal  : " + e2.getClass().getSimpleName());
                return;
            }
        } catch (IOException e) {
            System.out.println("pasang gagal  : " + e.getClass().getSimpleName());
            return;
        }

        // Verifikasi akhir: baca balik hasil dan hitung barisnya.
        try (BufferedReader pembaca =
                     Files.newBufferedReader(hasil, StandardCharsets.UTF_8)) {
            System.out.println("-- ringkasan.csv --");
            pembaca.lines().forEach(b -> System.out.println("  " + b));
            long jumlah = Files.lines(hasil, StandardCharsets.UTF_8).count();
            System.out.println("verifikasi    : " + jumlah
                    + " baris (1 judul + " + valid.size() + " data)");
        } catch (IOException e) {
            System.out.println("verifikasi gagal: " + e.getClass().getSimpleName());
        }
    }

    // Konfigurasi opsional: hilang atau rusak tidak membatalkan proses.
    static int bacaBatas() {
        try {
            String isi = Files.readString(Path.of("konfigurasi.txt"));
            return Integer.parseInt(isi.trim());
        } catch (IOException | NumberFormatException e) {
            return 60;
        }
    }
}
