import java.util.ArrayList;
import java.util.List;

public class ValidasiPayload {

    record PermintaanProduk(String nama, String email, int harga, int stok) {}

    record Kesalahan(String bidang, String pesan) {}

    static List<Kesalahan> periksa(PermintaanProduk p) {
        List<Kesalahan> galat = new ArrayList<>();
        if (p.nama() == null || p.nama().isBlank()) {
            galat.add(new Kesalahan("nama", "wajib diisi"));
        } else if (p.nama().length() > 60) {
            galat.add(new Kesalahan("nama", "panjang maksimal 60 karakter"));
        }
        if (p.email() == null || !p.email().matches("[\\w.+-]+@[\\w-]+(\\.[\\w-]+)+")) {
            galat.add(new Kesalahan("email", "format alamat email tidak valid"));
        }
        if (p.harga() <= 0) {
            galat.add(new Kesalahan("harga", "harus bilangan bulat positif"));
        }
        if (p.stok() < 0 || p.stok() > 10_000) {
            galat.add(new Kesalahan("stok", "harus di antara 0 dan 10000"));
        }
        return galat;
    }

    static String jsonRespons(List<Kesalahan> galat) {
        if (galat.isEmpty()) {
            return "{\"status\":\"valid\",\"data\":\"diproses\"}";
        }
        StringBuilder b = new StringBuilder("{\"status\":\"tidak valid\",\"kesalahan\":[");
        for (int i = 0; i < galat.size(); i++) {
            if (i > 0) {
                b.append(",");
            }
            b.append("{\"bidang\":\"").append(galat.get(i).bidang())
                    .append("\",\"pesan\":\"").append(galat.get(i).pesan()).append("\"}");
        }
        return b.append("]}").toString();
    }

    public static void main(String[] args) {
        PermintaanProduk sehat = new PermintaanProduk(
                "Buku Java", "budi@example.com", 85000, 10);
        PermintaanProduk rusak = new PermintaanProduk(
                "", "budi#example", -5000, 20000);

        System.out.println("== Payload sehat ==");
        System.out.println(jsonRespons(periksa(sehat)));

        System.out.println();
        System.out.println("== Payload bermasalah: kumpulkan semua kesalahan ==");
        for (Kesalahan k : periksa(rusak)) {
            System.out.printf("  %-6s %s%n", k.bidang(), k.pesan());
        }

        System.out.println();
        System.out.println("== Respons 400 dengan daftar kesalahan ==");
        System.out.println(jsonRespons(periksa(rusak)));
    }
}
