import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class EncoderMini {

    public static void main(String[] args) {
        String komentar = "Skrip uji: <script>alert('XSS')</script> dari Dewi & Budi";

        System.out.println("=== Konteks HTML: entity escape ===");
        System.out.println("Asli : " + komentar);
        System.out.println("Aman : " + escapeHtml(komentar));

        System.out.println();
        System.out.println("=== Konteks URL: percent-encoding ===");
        String kueri = "kota=Bandung & cuaca=cerah";
        System.out.println("Asli : " + kueri);
        System.out.println("Aman : " + URLEncoder.encode(kueri, StandardCharsets.UTF_8));

        System.out.println();
        System.out.println("=== Konteks atribut HTML yang bernilai URL ===");
        System.out.println("Aman : redirect.jsp?next="
                + URLEncoder.encode("dashboard?id=7&tab=saldo", StandardCharsets.UTF_8));
    }

    // Encoder HTML minimal: lima karakter yang bermakna khusus di HTML
    // diganti entity-nya. Urutan penggantian & lebih dulu penting agar
    // hasil penggantian tidak di-escape ulang.
    static String escapeHtml(String teks) {
        StringBuilder hasil = new StringBuilder(teks.length() + 16);
        for (int i = 0; i < teks.length(); i++) {
            switch (teks.charAt(i)) {
                case '&' -> hasil.append("&amp;");
                case '<' -> hasil.append("&lt;");
                case '>' -> hasil.append("&gt;");
                case '"' -> hasil.append("&quot;");
                case '\'' -> hasil.append("&#39;");
                default -> hasil.append(teks.charAt(i));
            }
        }
        return hasil.toString();
    }
}
