package com.android.commands.monkey.ape.jev;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.Properties;
import org.json.*;

/** Explicit live preflight using the production Java transport and response validator. */
public final class ProviderPreflight {
    public static void main(String[] args) throws Exception {
        boolean validate="--validate".equals(args[0]);
        Properties config=new Properties();
        try(InputStream in=new FileInputStream(args[validate?1:0])) {config.load(in);}
        String endpoint=config.getProperty("ape.jev.endpoint"),model=config.getProperty("ape.jev.model");
        int timeout=Integer.parseInt(config.getProperty("ape.jev.timeoutMs"));
        int maxBytes=Integer.parseInt(config.getProperty("ape.jev.maxRequestBytes"));
        if(validate) {
            for(int i=2;i<args.length;i++) {
                String fixture=new String(Files.readAllBytes(Paths.get(args[i])),StandardCharsets.UTF_8);
                JevProtocol.Request request=JevProtocol.wire("preflight-"+(i-1),fixture,maxBytes,model);
                System.out.println(request.requestId+" VALID "+request.requestBytes+" bytes");
            }
            return;
        }
        String token=JevProvider.token(config.getProperty("ape.jev.provider", "startlux"));
        Path output=Paths.get(args[1]);Files.createDirectories(output);
        boolean success=true;
        try(JevClient client=new JevClient(endpoint,token,timeout,1)) {
            for(int i=2;i<args.length;i++) {
                String fixture=new String(Files.readAllBytes(Paths.get(args[i])),StandardCharsets.UTF_8);
                JevProtocol.Request request=JevProtocol.wire("preflight-"+(i-1),fixture,maxBytes,model);
                Files.write(output.resolve(request.requestId+"-request.json"),request.bodyJson.getBytes(StandardCharsets.UTF_8));
                JSONObject receipt=new JSONObject().put("endpoint",endpoint).put("model_requested",model).put("fixture",args[i])
                    .put("request_id",request.requestId).put("request_bytes",request.requestBytes).put("evidence_digest",request.evidenceDigest)
                    .put("history_count",request.historyCount).put("candidate_count",request.candidateIds.size());
                if(!client.submit(request))throw new AssertionError("preflight submission rejected");
                long deadline=System.nanoTime()+(2L*timeout+7000L)*1000000;
                JevClient.Completion done;
                while((done=client.poll())==null && System.nanoTime()<deadline)Thread.sleep(5);
                if(done==null)throw new AssertionError("preflight completion missing");
                receipt.put("attempts",done.attempts).put("elapsed_ns",done.latencyNanos()).put("status",done.error==null?"PASS":"FAIL");
                if(done.error==null)receipt.put("validated_response",done.result.toJson()).put("http_status",200);
                else {receipt.put("error",done.error);success=false;}
                client.pollSent();
                Files.write(output.resolve(request.requestId+"-receipt.json"),receipt.toString(2).getBytes(StandardCharsets.UTF_8));
                System.out.println(request.requestId+" "+receipt.getString("status")+" "+done.attempts);
                if(!success)break;
            }
        }
        if(!success)System.exit(1);
    }
}
