import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MesinTemplateMini {

    static String escapeHtml(String teks) {
        return teks.replace("&", "&amp;")
                .replace("<", "&lt;")
                .replace(">", "&gt;")
                .replace("\"", "&quot;")
                .replace("'", "&#39;");
    }

    static String render(String template, Map<String, String> konteks) {
        Pattern pola = Pattern.compile("\\$\\{(\\w+)}");
        Matcher cocok = pola.matcher(template);
        StringBuilder hasil = new StringBuilder();
        while (cocok.find()) {
            String nilai = konteks.getOrDefault(cocok.group(1), "");
            cocok.appendReplacement(hasil, Matcher.quoteReplacement(escapeHtml(nilai)));
        }
        cocok.appendTail(hasil);
        return hasil.toString();
    }

    public static void main(String[] args) {
        String template = """
                <html>
                  <h1>Selamat datang, ${nama}!</h1>
                  <p>Keranjang Anda berisi ${jumlah} barang.</p>
                </html>
                """;

        Map<String, String> konteksNormal = new LinkedHashMap<>();
        konteksNormal.put("nama", "Budi Santoso");
        konteksNormal.put("jumlah", "3");
        System.out.println("== Render dengan data normal ==");
        System.out.print(render(template, konteksNormal));

        Map<String, String> konteksCurang = new LinkedHashMap<>();
        konteksCurang.put("nama", "<script>alert('xss')</script>");
        konteksCurang.put("jumlah", "0");
        System.out.println("== Render dengan masukan berbahaya ==");
        System.out.print(render(template, konteksCurang));

        String barisTemplate = "  <li>${barang}</li>\n";
        List<String> barang = List.of("Buku Java", "Pena", "Tas<kecil>");
        System.out.println("== Render daftar barang ==");
        StringBuilder daftar = new StringBuilder("<ul>\n");
        for (String b : barang) {
            Map<String, String> konteksBaris = new LinkedHashMap<>();
            konteksBaris.put("barang", b);
            daftar.append(render(barisTemplate, konteksBaris));
        }
        daftar.append("</ul>");
        System.out.print(daftar);
    }
}
