package com.zehong.web.controller.api;

import com.alibaba.fastjson.JSONObject;
import com.zehong.system.domain.TSiteStationInfo;
import com.zehong.system.domain.http.Save;
import com.zehong.system.domain.http.WorkerCertDirectDTO;
import com.zehong.system.service.ITSiteStationInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.crypto.Cipher;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

@Controller
public class APIController {


    private static final String RSA_ALGORITHM = "RSA";

    @Autowired
    private ITSiteStationInfoService tSiteStationInfoService;
    /**
     * 场站信息管道气企业添加
     */
    @RequestMapping("/addSave")
    public void addSave() throws Exception {
        //企业ID为一  燃气集团 生成 加密 公钥 私钥
        String publicKeyString = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnbtzv7xsBPF9rGf/+4ejdNfowbFWq8qxqrNOxrUxrklhCd173Uud4UeV4HBrNiioX2/3QMy8PhPMik3u7swcPTkcEAUhCIkIua4tJ2sEvjveUuzBqeRYVQiADjrr5wm2TXC63b5ihxPPMqdJWdHOnUfXimdqx8TEvHr7ILyV1j+kyBTlVQEpB3IyCHfoW+1orffI0BC77PQEVb9hoBuL6LSqwj8YPb+2YIatPHhSh1SjMut7KhJiOwkomJAqewaBFP/eUjR0k8qeYMGdtio3dxJiifSSl8VKpAbbfSaoLBBky//k9nxB1wdr7cXDu0evwly0C+OhQadBPVmscJMNkQIDAQAB";
        String privateKeyString = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfFl4M10ib38cayb4u4vw2/JwZtptWQ6viAm/8t82QM8i2qPYNMalmCsIpO4+7QbSVO+MjG+hfnKJt6Xc2g+qaiERnqifckXgxa3sqhwCtdpaRyKn3YyuTWzfZgcePOjQNvxAlToK3aV0JoqyFfdGVasVgNeM5Jsy9gDvBzYNmPVDur/WQGFIGpNUdzsdbBhib85a0EVctnoo+9z6yek0RbaJUqh5r63miTPk3PCJ8lXv5p1hAQg8hZ6t+yxCGzpMtCuQwZ/UnYh90w4bWytIi2Lg/GVrhQbJ+q9TFD7rTXIaOH9MJ4gZImvyg+P27p4HadD3k17YIn+UJa7F3sPM1AgMBAAECggEAIsmmWVJ+Wy+M/2ucPe5+zptgmzLWNv/nRy3XRUEAH4djXaYG4A27CEhT+uY+YOlWTsfgvF2u67F5x2UlH3OrSo1/v9dyjgX1bYEeVsdcu5HSDSD/Icy6y6dHyDVb6RMGLPdZ1X6ckPTmVmQPK8W+ndjSPl6qSGYWoV24M4H4ONPYonmQoL7P4DR7jHDbCzqoaBYcrxZT6K52apGKOBqzRrRxlrFPPScvVwaRSXWSYZcN18K9z7yiXwFf1nwBizRGFt6tvchwgYpjxLLON8qcxcLvtcvmrqAqIdIf9HlPOHnkwjgFqNFwXxI48e26gwV2kBJRajrskyusFlbIATv1ZQKBgQDmj27N2Gx08G3dvGQYnTw3rDBbWn7F4ZXe5f6wNAv5kFr/VuIB046u2jQAdWtUmeM5eRd6PeTE4OvX7FuC/o2m/BaKhNWP6No9yzKwuyCNj4dj98G9H5vneOa3RY3F1ma/Bd8hoY6QC/NQDoabp4wFKjYbcD9uHsdLD0S9x405nwKBgQCwpA+HY13A/MVXgTTQ2+A24b+cE5VobOnoJ2ad3NuyYx71CQ4nu9BORSkh6fB2A0DkHY1/wOexi1qILFlwABWZRFKRkwY7+vAJjLlaG5QtvUixWgQ0HvNlWC/e6XfsWJjeKcJmsBlrnfI3uZvxfXveDVlHOfF+e//zKzUTYJzKqwKBgHyDX6K5S7FHmv3R3PjSCZBDZIYhdC9nqamL6iS8pu7rP8l/4WR9HSRe4RCSWRmCVg1W0RAKVv7gPV4J3k37LQLOR1odbLxgU2Rl1YVOOcFZjxO03KNHa8nxKCA35t298RUelacy+avfWFKW1alALcUoS7o7v3W4F4b4wvX+y80fAoGAfmq77mIv++krdseyu/NQkRaZYiMl35lrAcoJB9vDo/SKeEWlyswAdbPLj0j03hDQBTIdTZwKdadNAH30+FInIwyhpyu4335lAgCjuphYQS/hcYQB1Cd+fD5T7E3clNqHdSAf0Awh9UIR0s3UjE0JNE8LYQ1YBvTJpgd7McYIEIcCgYEAsKgI481TPfjrCML0bjZ+d5O8fObFcQup2CzAlXvZtQrM62/Siubwta7IRiZK6yeMbU4uWeZxNBdPIE8Dd5HBFRHiJiD8uB3gdq91YxQYmbu1i37MxueAAlGGpD6Ds5OZZ6+PZZw2SGcUMgY2Y06eqVyxfbdCWuA8sQ4oxyb8DmI=";

        RsaToClient rsa = new RsaToClient(privateKeyString, publicKeyString);

        TSiteStationInfo tSiteStationInfo=new TSiteStationInfo();
        tSiteStationInfo.setBeyondEnterpriseId("15");
        List<TSiteStationInfo> tSiteStationInfos = tSiteStationInfoService.selectTSiteStationInfoList(tSiteStationInfo);
        //        组装加密数据结构 (这里根据接口参数进行调整组装格式)

        for (int i=0;i<tSiteStationInfos.size();i++){
            Save model = new Save();
            //场站地址
            model.setAddress("无");
            //建设日期
            model.setBuildDate(tSiteStationInfos.get(i).getBuildDate());
            //施工单位
            model.setConstructionUnit(tSiteStationInfos.get(i).getBuildUnit());
            //联系人
            model.setContact("无");
            //身份证
            model.setDirectorIdcardCode("508475209510309953");
            model.setPhoneNumber("18982222222");
            //监控和数据采集系统
            model.setEqEightNum("0");
            //激光云台
            model.setEqFiveNum("0");
            //防雷及防静电接地装置
            model.setEqFourNum("0");
            //燃气浓度检测报警装置
            model.setEqOneNum("0");
            //防第三方入侵系统
            model.setEqSevenNum("0");
            //视频安防系统
            model.setEqSixNum("1");
            //消防系统
            model.setEqThreeNum("1");
            //超限报警
            model.setEqTwoNum("0");
            //燃气分类
            model.setGasType("1");
            //重大危险源级别
            model.setHazardGrade("0");
            //联系方式
            model.setHazardName("0");
            //坐标点
            model.setPoint(String.valueOf(tSiteStationInfos.get(i).getLongitude())+" "+String.valueOf(tSiteStationInfos.get(i).getLatitude()));
            //投产时间
            model.setProductionDate("2023-09-22");
            //所属区县
            model.setRegion("130203");
            //备注
            model.setRemark(tSiteStationInfos.get(i).getRemark());
            //场站规模
            model.setScale("0");
            //场站级别
            model.setStaLevel("1");
            //场站状态
            model.setStaStatus("1");
            //场站编码
            model.setStationCode("0"+i);
            //场站用途
            model.setStationDestination("无");
            //场站分类
            model.setStationKind("1000190002");
            //站点面积
            model.setStationMeasure("100");
            //场站名称
            model.setStationName("无");
            //场站类型
            model.setStationType("2");
            //储罐总容积
            model.setStorageVolume("0");

            List<Save> list = new ArrayList<>();
            list.add(model);
            WorkerCertDirectDTO workerCertDirectDTO=new WorkerCertDirectDTO();
            workerCertDirectDTO.setList(list);
            String jsonObj = JSONObject.toJSONString(list);
            //加密
            //11130200001 企业ID=1的 企业CODE 这个月header参数是对应的
            String data = "11130221019@"+jsonObj;
            System.out.println("data=" + data);

            //加密的算法有长度限制 不再采用配合其他加密算法来解决了 直接切断处理加密
            String encryptedData = rsa.encryptMaxString(data, publicKeyString);



            //1. 创建URL对象
            URL url = new URL("http://101.43.197.44:8129/enterApi/s1_controller/save");
            //2. 创建HttpURLConnection对象
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //3. 设置请求方法
            conn.setRequestMethod("POST");
            //4. 设置请求头
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Charset", "UTF-8");
            conn.setRequestProperty("enterpriseCode", "11130221019");
            //5. 设置参数
            JSONObject jsonpObject = new JSONObject();
            jsonpObject.put("data", encryptedData);
            //6. 发送数据
            conn.setDoOutput(true);
            OutputStream outputStream = conn.getOutputStream();
            outputStream.write(jsonpObject.toString().getBytes());
            outputStream.flush();
            outputStream.close();
            //7. 获取返回值
            InputStream inputStream = conn.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
            String result = stringBuilder.toString();
            System.out.println(result);

//            System.out.println("加密后的数据:" + encryptedData);
        }

    }

    /**
     * 将byte数组按照指定大小分割成多个数组
     *
     * @param bytes   要分割的byte数组
     * @param subSize 分割的块大小  单位:字节
     * @return 指定大小的byte数组
     */

    public static Object[] splitByteArr(byte[] bytes, int subSize) {
        int count = bytes.length % subSize == 0 ? bytes.length / subSize : bytes.length / subSize + 1;

        List<List<Byte>> subAryList = new ArrayList<List<Byte>>();

        for (int i = 0; i < count; i++) {
            int index = i * subSize;
            List<Byte> list = new ArrayList<Byte>();
            int j = 0;
            while (j < subSize && index < bytes.length) {
                list.add(bytes[index++]);
                j++;
            }
            subAryList.add(list);
        }

        Object[] subAry = new Object[subAryList.size()];

        for (int i = 0; i < subAryList.size(); i++) {
            List<Byte> subList = subAryList.get(i);
            byte[] subAryItem = new byte[subList.size()];
            for (int j = 0; j < subList.size(); j++) {
                subAryItem[j] = subList.get(j);
            }
            subAry[i] = subAryItem;
        }
        return subAry;
    }

    /**
     * 使用公钥加密数据
     *
     * @param data      待加密的数据
     * @param publicKey 公钥
     * @return 加密后的数据
     */
    public String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    /**
     * 对大字符串进行加密
     */
    public String encryptMaxString(String data, String publicKeyString) throws Exception {
        byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
        Object[] objects = splitByteArr(bytes, 245);
        String codeAll = "";
        //依次加密
        for (int i = 0; i < objects.length; i++) {
            byte[] temp = (byte[]) objects[i];
//            String encryptedData = encrypt(new String(temp, "UTF-8"), publicKeyString);
            String encryptedData = encrypt2(temp, publicKeyString);
            codeAll += "@@" + encryptedData;
        }
        return codeAll;
    }

    public  String encrypt2(byte[] data, String publicKeyString) throws Exception {
        PublicKey publicKey = generateRSAPublicKey(publicKeyString);
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data);
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    /**
     * 对小字符串进行加密 小于245字节的字符串
     *
     * @param data
     */
    public String encrypt(String data, String publicKeyString) throws Exception {
        PublicKey publicKey = generateRSAPublicKey(publicKeyString);
        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    /**
     * 公钥字符串 转换为公钥
     *
     * @param publicKeyString
     */
    public PublicKey generateRSAPublicKey(String publicKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
    }
}