/**
 * This class provides an example of using the DEVS-FIRE API.
 * This example shows how to set up a simulation and continue running the simulation in a stepwise fashion. The procedure is described below: 
 * 1: connect to the DEVS-FIRE API server and obtain a key, which is needed for all following-on calls.
 * 2: set wind condition for the simulation.
 * 3: set the location of the cell space using the latitude and longitude info, which decides what fuel and terrain data from the LANDFIRE database will be used. 
 * 4: get the fuel data of the cell space and display it using the API_FireState_Visualization. You may skip this step if there is no need to display the fuel.
 * 5: set the ignition point. If you need to set multiple ignition point, you may invoke the setPointIgnition multiple times.
 * 6: invoke continueSimulation to run simulation in an iterative fashion. Each iteration continues on top of the last iteration.
 *           In each iteration, the simulation results of all burning cells' ID and ignition time are returned as a String.
 *           To visualize the simulation result, this program uses the API_FireState_Visualization class that can be 
 *                 download from https://sims.cs.gsu.edu/sims/research/DEVSFIREAPI/API_FireState_Visualization.java.
 *           This program also invokes the getPerimeterCells API to obtain the list of perimeter cells at the end of each 
 *                 iteration and display it using the API_FireState_Visualization.  
 *
 * Copyright: Systems Integrated Modeling and Simulation (SIMS) Lab, Georgia State University, All Rights Reserved
 * Contact: Prof. Xiaolin Hu (xhu@gsu.edu)
 * Date: April 13 2024
 *
 */

import java.awt.Color;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpClient;
import java.net.http.HttpResponse;


public class MultiStep_ContinueSimulation_defaultGIS {
    public static void main(String[] args) throws IOException, InterruptedException {
        String base_url = "https://firesim.cs.gsu.edu";
        String simulationResult;

        double windSpeed = 8; // m/s
        double windDirection = 90;//0;//270;//90;//180;  // degree
        double lat = 37.24318;
        double lng = -99.03919;
        int simTime = 10000;  // seconds
        int ignition_x = 120;
        int ignition_y = 120;

        // Connecting to server
        HttpRequest request1 = HttpRequest.newBuilder()
                .uri(URI.create(base_url+"/api/connectToServer"))
                .header("accept", "application/json")
                .method("POST", HttpRequest.BodyPublishers.ofString("testtest"))
                .build();
        HttpResponse<String> response1 = HttpClient.newHttpClient().send(request1, HttpResponse.BodyHandlers.ofString());
        System.out.println(response1.body());
        String key = response1.body();

        // Setting wind conditions
        HttpRequest request2 = HttpRequest.newBuilder()
                .uri(URI.create(base_url+"/api/setWindCondition/?userToken="+key+"&windSpeed="+windSpeed+"&windDirection="+windDirection))
                .POST(HttpRequest.BodyPublishers.noBody())
                .build();
        HttpResponse<String> response2 = HttpClient.newHttpClient().send(request2, HttpResponse.BodyHandlers.ofString());
        //System.out.println(response2.body());

        //Setting center location
        HttpRequest request3 = HttpRequest.newBuilder()
                .uri(URI.create(base_url+"/api/setCellSpaceLocation/?userToken="+key+"&lat="+lat+"&lng="+lng))
                .POST(HttpRequest.BodyPublishers.noBody())
                .build();
        HttpResponse<String> response3 = HttpClient.newHttpClient().send(request3, HttpResponse.BodyHandlers.ofString());
        //System.out.println(response3.body());

        // get the fuel data of the cell space and display it using the API_FireState_Visualization
        // you may skip this step if there is no need to display the fuel
        HttpRequest request = HttpRequest.newBuilder()
      		  .uri(URI.create(base_url+"/api/getCellFuel/?userToken="+key))
      		  .POST(HttpRequest.BodyPublishers.noBody())
      		  .build();
      	HttpResponse<String> fuelResponse = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
      	String fuelDataString = fuelResponse.body();
		System.out.println("fule data string");
      	System.out.println(fuelDataString);

        //using the API_FireState_Visualization to visualize the simulation results.
        //you may remove the following two lines of code if you don't need the visualization
        API_FireState_Visualization visual = new API_FireState_Visualization();
        visual.displayFuel(fuelDataString);

        
        //Setting ignition Point
        HttpRequest request4 = HttpRequest.newBuilder()
                .uri(URI.create(base_url+"/api/setPointIgnition/?userToken="+key+"&xs="+ignition_x+"&ys="+ignition_y)) // Single Ignition point
//                .uri(URI.create(base_url+"/api/setPointIgnition/?userToken="+key+"&xs="+ignition_x+",60"+"&ys="+ignition_y+",60")) // Two ignition points
                .POST(HttpRequest.BodyPublishers.noBody())
                .build();
        HttpResponse<String> response4 = HttpClient.newHttpClient().send(request4, HttpResponse.BodyHandlers.ofString());
        //System.out.println(response4.body());

        
        int step = 8;
        double stepInterval = 1500; 
          			
        for(int i=1; i<step; i++) {        	 
             HttpRequest requestSim = HttpRequest.newBuilder()
            		.uri(URI.create(base_url+"/api/continueSimulation/?userToken="+key+"&time="+stepInterval))
            		.POST(HttpRequest.BodyPublishers.noBody())
            		.build();
            		HttpResponse<String> responseSim = HttpClient.newHttpClient().send(requestSim, HttpResponse.BodyHandlers.ofString());
//            		System.out.println("simulation result string");
//            		System.out.println(responseSim.body());
        			visual.visualize(responseSim.body());
        			
            		HttpRequest requestPerimeter = HttpRequest.newBuilder()
        			  .uri(URI.create(base_url+"/api/getPerimeterCells/?userToken="+key))
        			  .POST(HttpRequest.BodyPublishers.noBody())
        			  .build();
            		HttpResponse<String>  PerimeterResponse = HttpClient.newHttpClient().send(requestPerimeter, HttpResponse.BodyHandlers.ofString());
            		String perimeterString = PerimeterResponse.body();
        			System.out.println("perimeterString");
        			System.out.println(perimeterString);
        			Color c = Color.blue;
        			visual.displayPerimeter(perimeterString, c);
        			
        			System.out.println("finish iteration:"+ i);
        }     
        
        System.out.println("finished!");
    }
}
