import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Layanan pendukung Java (JDK 17+, tanpa dependensi): memvalidasi file batch event JSON lalu mengirimkannya
 * ke mesin deteksi. Validasi: ukuran maksimum, tipe event yang diizinkan, jumlah event <= 500.
 * (Sengaja tidak memakai Spring Boot agar mudah dijalankan; cukup untuk validasi + pengiriman.)
 *
 * Jalankan: SENSOR_KEY=... java SensorClient.java batch.json
 */
public class SensorClient {
    static final long MAX_BYTES = 1_000_000;
    static final int MAX_EVENTS = 500;
    static final Set<String> TYPES = Set.of("http_request", "login", "firewall", "metrics", "file_integrity",
            "syslog", "admin_action", "heartbeat");
    static final Pattern TYPE = Pattern.compile("\"type\"\\s*:\\s*\"([^\"]*)\"");

    /** Mengembalikan pesan kesalahan, atau null jika valid. */
    static String validate(String json) {
        if (json.getBytes(StandardCharsets.UTF_8).length > MAX_BYTES) return "payload terlalu besar";
        if (!json.contains("\"sensor_code\"") || !json.contains("\"events\"")) return "sensor_code/events wajib ada";
        Matcher m = TYPE.matcher(json);
        int n = 0;
        while (m.find()) {
            if (!TYPES.contains(m.group(1))) return "tipe event tidak diizinkan: " + m.group(1);
            if (++n > MAX_EVENTS) return "lebih dari " + MAX_EVENTS + " event";
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        if (args.length != 1) { System.err.println("Pemakaian: java SensorClient.java batch.json"); System.exit(2); }
        String key = System.getenv("SENSOR_KEY");
        if (key == null || key.isBlank()) { System.err.println("SENSOR_KEY wajib diisi"); System.exit(2); }
        String url = System.getenv().getOrDefault("ENGINE_URL", "http://127.0.0.1:8000");
        String json = Files.readString(Path.of(args[0]), StandardCharsets.UTF_8);
        String err = validate(json);
        if (err != null) { System.err.println("Ditolak oleh validator: " + err); System.exit(1); }
        HttpRequest req = HttpRequest.newBuilder(URI.create(url + "/api/v1/ingest"))
                .timeout(Duration.ofSeconds(15)).header("Content-Type", "application/json")
                .header("X-Sensor-Key", key).POST(HttpRequest.BodyPublishers.ofString(json)).build();
        HttpResponse<String> res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
        System.out.println(res.statusCode() + " " + res.body());
        System.exit(res.statusCode() == 200 ? 0 : 1);
    }
}
