import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FormUrlEncodedApiClient {

    public static void main(String[] args) {
        try {
            


             // Read JSON data from the file
             String jsonData = readJsonDataFromFile();
            

 // Log the received JSON data
 logToFile("Received JSON Data:\n" + jsonData);

            Map<String, String> params = new HashMap<>();
            params.put("accessCode", "CataloMars");
            params.put("timestamp", String.valueOf(System.currentTimeMillis()));
            //params.put("data", "{\\\"co\\\":\\\"WE2001222\\\",\\\"coNum\\\":202000,\\\"pNo\\\":\\\"WE2001222\\\",\\\"sku\\\":\\\"皮壳触感衬纸157g双粉\\\",\\\"lineName\\\":\\\"B2\\\",\\\"worker\\\":6,\\\"average\\\":150},{\\\"co\\\":\\\"WE2001133\\\",\\\"coNum\\\":202000,\\\"pNo\\\":\\\"WE2001133\\\",\\\"sku\\\":\\\"皮壳灰板1（厚度1.7mm）/侧板\\\",\\\"lineName\\\":\\\"B2\\\",\\\"worker\\\":6,\\\"average\\\":100},{\\\"co\\\":\\\"WE2001221\\\",\\\"coNum\\\":202000,\\\"pNo\\\":\\\"WE2001221\\\",\\\"sku\\\":\\\"皮壳触感面纸157g双粉\\\",\\\"lineName\\\":\\\"B2\\\",\\\"worker\\\":6,\\\"average\\\":150}");
            //params.put("data", "{\\\"co\\\":\\\"MO-2501275\\\",\\\"coNum\\\":500,\\\"pNo\\\":\\\"TEST\\\",\\\"sku\\\":\\\"TEST\\\",\\\"productName\\\":\\\"812068 Ultimate Signature Nutrition Solution 30 Packets HK\\\",\\\"productCode\\\":\\\"812068\\\",\\\"lineName\\\":\\\"Bottle Unscrambler\\\",\\\"worker\\\":1,\\\"average\\\":1800,\\\"processName\\\":\\\"理瓶\\\",\\\"so\\\":\\\"MO-2501275\\\",\\\"po\\\":\\\"MO-2501275\\\",\\\"customerCode\\\":\\\"TEST\\\",\\\"scheduleDate\\\":\\\"2025/4/9\\\",\\\"scheduleQty\\\":500}");
            params.put("data", jsonData);

            String secretKey = "a2fUQJznuRE98B7gVbwc54";
            String sign = sign(params, secretKey);
            params.put("sign", sign);

            String formData = getFormDataString(params);
            sendPostRequest("http://218.255.190.194/api/dock/uploadSchedules", formData);
            //String response = sendPostRequest("http://218.255.190.194/api/dock/uploadSchedules", formData);
            
// Log the response from the second API
// logToFile("Response from Second API:\n" + response);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
     
static String readJsonDataFromFile() throws IOException {
  StringBuilder jsonData = new StringBuilder();

  
try (BufferedReader br = new BufferedReader(new FileReader("C:\\IOT_dashboard\\savedata\\data.json", StandardCharsets.UTF_8))) {

    
// try (BufferedReader br = new BufferedReader(new FileReader("data.json", StandardCharsets.UTF_8))) {
 String line;
 while ((line = br.readLine()) != null) {
 jsonData.append(line);
 }
 }
 return jsonData.toString();
 }
       

    static String sign(Map<String, String> data, String secretKey) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("secretkey=" + secretKey);
        for (String k : data.keySet()) {
            list.add(k + "=" + data.get(k));
        }
        Collections.sort(list);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); ++i) {
            if (i > 0) {
                sb.append("&");
            }
            sb.append(list.get(i));
        }
        return sha1(sb.toString());
    }

    static String sha1(String s) throws Exception {
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        byte[] btInput = s.getBytes();
        MessageDigest mdInst = MessageDigest.getInstance("SHA-1");
        mdInst.update(btInput);
        byte[] md = mdInst.digest();
        int j = md.length;
        char str[] = new char[j * 2];
        int k = 0;
        for (int i = 0; i < j; i++) {
            byte byte0 = md[i];
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            str[k++] = hexDigits[byte0 & 0xf];
        }
        return new String(str);
    }

    static String getFormDataString(Map<String, String> params) throws Exception {
        StringBuilder formData = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (formData.length() != 0) {
                formData.append("&");
            }
            formData.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            formData.append("=");
            formData.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        return formData.toString();
    }

    static void sendPostRequest(String urlString, String formData) throws Exception {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; utf-8");
        conn.setDoOutput(true);

        try (OutputStream os = conn.getOutputStream()) {
            byte[] input = formData.getBytes("utf-8");
            os.write(input, 0, input.length);
        }

        int responseCode = conn.getResponseCode();
        System.out.println("Response Code: " + responseCode);
        logToFile("API Response Code: " + responseCode);

        try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"))) {
            StringBuilder response = new StringBuilder();
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine.trim());
            }
            System.out.println("Response Body: " + response.toString());
            logToFile("API Response Body: " + response.toString());
        }
    }

    
static void logToFile(String content) {
 try (FileWriter fw = new FileWriter("C:\\IOT_dashboard\\postdata\\java_post_log.txt", true)) {
 fw.write(java.time.LocalDateTime.now() + " - " + content + "\n");
 } catch (Exception e) {
 e.printStackTrace();
 }
 }

}