import java.util.Arrays;

/**
 * Pemeriksa regresi performa atas metrik beku (canned): median baseline
 * dibandingkan median kandidat dengan pita derau, lalu keputusan CI diambil.
 * Seluruh angka adalah data contoh deterministik, bukan pengukuran nyata.
 */
public class PemeriksaRegresi {

    record Metrik(String nama, double[] baseline, double[] kandidat) {}

    record Lingkungan(String runner, int core) {}

    // Median: kuat terhadap sampel ekstrem, lebih stabil daripada satu angka
    static double median(double[] x) {
        double[] s = x.clone();
        Arrays.sort(s);
        int n = s.length;
        return (n % 2 == 1) ? s[n / 2] : (s[n / 2 - 1] + s[n / 2]) / 2.0;
    }

    static String status(double delta, double pita) {
        if (delta > pita) {
            return "REGRESI";
        }
        if (delta < -pita) {
            return "MEMBAIK";
        }
        return "STABIL";
    }

    public static void main(String[] args) {
        double pita = 0.10; // perubahan di bawah 10% dianggap derau

        Metrik[] semua = {
            new Metrik("parseJson",    new double[] {4.1, 4.3, 4.2}, new double[] {5.0, 5.2, 4.9}),
            new Metrik("queryCache",   new double[] {1.20, 1.25, 1.22}, new double[] {1.23, 1.29, 1.24}),
            new Metrik("serializeDto", new double[] {8.4, 8.6, 8.5}, new double[] {6.9, 7.1, 7.0}),
        };

        System.out.println("== Pemeriksa regresi: median vs pita derau 10% ==");
        System.out.printf("%-13s %9s %9s %8s %9s%n", "metrik", "baseline", "kandidat", "delta", "status");
        int jumlahRegresi = 0;
        for (Metrik m : semua) {
            double base = median(m.baseline());
            double kand = median(m.kandidat());
            double delta = (kand - base) / base;
            String st = status(delta, pita);
            if (st.equals("REGRESI")) {
                jumlahRegresi++;
            }
            System.out.printf("%-13s %9.2f %9.2f %+7.1f%% %9s%n",
                m.nama(), base, kand, delta * 100, st);
        }
        System.out.println();
        if (jumlahRegresi > 0) {
            System.out.println("KEPUTUSAN CI: FAIL (" + jumlahRegresi
                + " regresi melampaui pita derau)");
        } else {
            System.out.println("KEPUTUSAN CI: PASS (tidak ada regresi melampaui pita derau)");
        }
        System.out.println();

        // ---- Pemeriksaan lingkungan eksekusi ----
        System.out.println("== Pemeriksaan lingkungan eksekusi ==");
        Lingkungan asal = new Lingkungan("runner-a", 8);
        Lingkungan kini = new Lingkungan("runner-b", 4);
        System.out.println("baseline: " + asal);
        System.out.println("kandidat : " + kini);
        if (!asal.equals(kini)) {
            System.out.println("status   : TIDAK SAMPAI - angka lintas lingkungan");
            System.out.println("            tidak dibandingkan");
        }
        System.out.println();
        System.out.println("Kesimpulan: kunci baseline di repositori, bandingkan");
        System.out.println("hanya dalam lingkungan sama, dan gagalkan build saat");
        System.out.println("regresi melampaui pita derau.");
    }
}
