package com.lilosoft.api.service;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.lilosoft.api.api.ApplyApi;
import com.lilosoft.api.api.OcrApi;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import retrofit2.Response;

import java.net.URLEncoder;
import java.util.*;

@Service
public class PublicService {

    /**
     * 日志对象
     */
    public Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private ApplyApi applyApi;

    @Autowired
    private OcrApi ocrApi;

    /**
     * 网上申报
     */
    public String webApply(HashMap<String, Object> paramsMap, HashMap<String, Object> formData) throws Exception {
        logger.info(JSONUtil.toJsonStr(paramsMap));
        String itemCode = paramsMap.get("ItemCode").toString();//事项code
        String objectType = paramsMap.get("objectType").toString();//表单服务对象类型,1:人员;2:项目 3:企业
        String orgType = paramsMap.get("orgType").toString();

        JSONArray materials = JSONUtil.parseArray(paramsMap.get("materials"));//材料列表
        String result = "";//错误描述
        String type = "info";//基本要素: "info",申请材料:"material" 非必填
        //第一步 获取事项信息
        HashMap<String, Object> project = applyApi.getItemInfoByItemCode("http://10.224.12.79:8085/sxgl/main/power/getItemInfoByItemCode", itemCode, "");
        String state = project.get("state").toString();
        if("1".equals(state)){
            JSONObject itemInfo = JSONUtil.parseArray(project.get("ItemInfo")).getJSONObject(0);
            String id = itemInfo.getStr("ID");//事项ID
            String code = itemInfo.getStr("CODE");//事项编码
            String version = itemInfo.getStr("VERSION");//版本号
            String name = itemInfo.getStr("NAME");//事项名称
            String regionCode = itemInfo.getStr("REGION_CODE");//区划编码
            String regionName = itemInfo.getStr("REGION_NAME");//区划名称
            String orgCode = itemInfo.getStr("ORG_CODE");//事项部门编码
            String orgName = itemInfo.getStr("ORG_NAME");//事项部门名称

            //第二步 根据事项ID获取表单
            HashMap<String, Object> formInfo = applyApi.getFormInfo("http://10.224.12.79:9087/zhsl/Service/getFormInfo", itemCode);
            String state1 = formInfo.get("state").toString();
            if("200".equals(state1)){
                JSONObject info = JSONUtil.parseArray(formInfo.get("info")).getJSONObject(0);
                String formId = info.getStr("formId");//表单ID
                String formName = info.getStr("formName");//表单名称

                //第三步 提交表单
                HashMap<String, Object> submitForm = new HashMap<>();
                submitForm.put("formId", formId);
                submitForm.put("formData", JSONUtil.toJsonStr(formData));
                HashMap<String, Object> saveDataEx = applyApi.saveDataEx("http://10.224.12.79:9087/zhsl/Service/saveDataEx", submitForm);

                String state2 = saveDataEx.get("state").toString();
                if("200".equals(state2)){
                    String dataId = saveDataEx.get("dataId").toString();//表单数据ID
                    //第四步 上传材料
                    for (int n = 0, m = materials.size(); n < m ; n++) {
                        JSONObject jsonObject1 = materials.getJSONObject(n);
                        String fileName = jsonObject1.getStr("fileName");//上传文件名
                        String fileUrl = jsonObject1.getStr("fileUrl");//上传文件下载地址
                        HashMap<String, Object> upload = this.upload(fileName, fileUrl);
                        if(upload != null){
                            String state3 = upload.get("code").toString();
                            if("0000".equals(state3)){
                                String uuid = upload.get("uuid").toString();//文件ID
                                jsonObject1.putOpt("uuid", uuid);
                            } else {
                                jsonObject1.putOpt("uuid", "");//上传失败默认为空
                                result = "上传材料报错:" + upload.get("msg").toString();
                            }
                        }
                    }
                    //组装metail数据结构
                    JSONArray material = JSONUtil.parseArray(project.get("material"));//事项材料列表
                    List<HashMap<String, String>> metail = new ArrayList<>();
                    HashMap<String, String> materialMap;
                    for (int n = 0, m = materials.size(); n < m ; n++) {
                        JSONObject jsonObject1 = materials.getJSONObject(n);
                        String fileCode = jsonObject1.getStr("fileCode");//办件材料code
                        String uuid = jsonObject1.getStr("uuid");//文件ID
                        materialMap = new HashMap<>();
                        for (int i = 0, j = material.size(); i < j ; i++) {
                            JSONObject jsonObject = material.getJSONObject(i);
                            String mcode = jsonObject.getStr("MCODE");//MCODE
                            String materialCode = jsonObject.getStr("CODE");//材料ID
                            if(mcode.equals(fileCode) && StrUtil.isNotEmpty(uuid)){
                                String materialName = jsonObject.getStr("NAME");//材料名称
                                String fileName = jsonObject1.getStr("fileName");//上传文件名
                                materialMap.put("DOCUMENT_ID", materialCode);//材料ID
                                materialMap.put("DOCUMENT_NAME", materialName);//材料名称
                                materialMap.put("TYPE", "1");//文件类型(纸质:0;电子:1)
                                materialMap.put("FILE_NAME", fileName);//上传文件名,如:030411240740_01.jpg
                                materialMap.put("FILE_PATH", uuid);//文件路径,通过上传材料获取uuid
                                metail.add(materialMap);
                                break;
                            }
                        }
                    }

                    //第五步 网上申报
                    //基本信息
                    Map<String, Object> infoMap = new LinkedHashMap<>();
                    //服务对象类型,objectType 1:人员;2:项目 3:企业
                    if("1".equals(objectType)){
                        infoMap.put("identityType", "10");//证件类型,默认身份证10
                        infoMap.put("idcardNo", paramsMap.get("idcardNo"));//证件号
                        infoMap.put("name", paramsMap.get("applyName"));//姓名
                        infoMap.put("linkPhone", paramsMap.get("linkPhone"));//联系电话
                        infoMap.put("linkAddress", paramsMap.get("linkAddress"));//联系地址
                    }
                    if("2".equals(objectType)){
                        infoMap.put("projectName", paramsMap.get("projectName"));//项目名称
                        infoMap.put("projectCode", paramsMap.get("projectCode"));//项目编码
                    }
                    if("3".equals(objectType)){
                        infoMap.put("orgName", paramsMap.get("orgName"));//组织机构名称
                        infoMap.put("orgCode", paramsMap.get("orgCode"));//组织机构代码
                        infoMap.put("orgType", orgType);//组织机构类型
                        infoMap.put("legalPerson", paramsMap.get("legalPerson"));//法定代表人
                        infoMap.put("linkMan", paramsMap.get("linkMan"));//企业联系人
                        infoMap.put("contactPhone", paramsMap.get("contactPhone"));//企业联系电话
                        infoMap.put("registerAddress", paramsMap.get("registerAddress"));//单位注册地址
                    }

                    //服务清单
                    Map<String, Object> servicelist = new LinkedHashMap<>();
                    servicelist.put("ApplicantName", paramsMap.get("name"));//办事人
                    servicelist.put("ApplicantID", paramsMap.get("idcard"));//身份证号码
                    servicelist.put("ApplicantMobile", paramsMap.get("phone"));//办事人手机号
                    servicelist.put("ApplicantAddress", paramsMap.get("address"));//办事人联系地址
                    servicelist.put("SendType", "0");//邮寄方式,0为自取,1为投递
                    servicelist.put("ApplicantType", "10");//证件类型,详情看字典,暂定身份证

                    //最终提交数据
                    Map<String, Object> applyMap = new LinkedHashMap<>();
                    applyMap.put("State", "sp");//sp:外网首次提交; bqbz:外网二次提交
                    applyMap.put("ReceiveNum", "");//业务实例号,外网二次提交必填
                    applyMap.put("ItemId", id);//事项ID
                    applyMap.put("ItemCode", code);//事项CODE
                    applyMap.put("ItemName", name);//事项名称
                    applyMap.put("OrgCode", orgCode);//事项所属单位编码
                    applyMap.put("OrgName", regionName);//事项所属单位名称
                    applyMap.put("ObjectType", objectType);//服务对象类型,1:人员;2:项目 3:企业
                    applyMap.put("DataId", dataId);//表单数据ID
                    applyMap.put("FormId", formId);//表单ID
                    applyMap.put("metail", metail);//材料列表 list
                    applyMap.put("servicelist", servicelist);//服务清单 list
                    applyMap.put("info", infoMap);//基本信息
                    applyMap.put("IsPrejudication", "11");//办件状态,11:待预审
                    applyMap.put("ApplyFrom", "17");//申报来源  17预审机器人
                    JSONConfig jsonConfig = JSONConfig.create();
                    jsonConfig.setIgnoreNullValue(false);
                    logger.info(JSONUtil.toJsonStr(applyMap, jsonConfig));
                    HashMap<String, Object> apply = applyApi.webApply("http://10.224.12.79:9087/zhsl/Service/webApply", JSONUtil.toJsonStr(applyMap, jsonConfig));
                    String state4 = apply.get("state").toString();
                    if("200".equals(state4)){
                        String receiveNum = apply.get("receiveNum").toString();
                        logger.info("办件申报成功,业务的办件编号:" + receiveNum);
                    } else {
                        result = "办件申报信息报错:"+ apply.get("error").toString();
                    }
                } else {
                    result = "提交表单信息报错:"+ saveDataEx.get("error").toString();
                }
            } else {
                result = "获取表单信息报错:"+ formInfo.get("detailMessage").toString();
            }
        } else {
            result = "获取事项信息报错:"+ project.get("error").toString();
        }
        if(StrUtil.isNotEmpty(result)){
            logger.error("接口调用失败:" + result);
        }
        return result;

    }

    /**
     * 上传文件到审批系统
     * @param fileName 上传文件名
     * @param fileUrl 上传文件下载地址
     * @return
     * @throws Exception
     */
    public HashMap<String, Object> upload(String fileName, String fileUrl) throws Exception {
        HashMap<String, Object> upload = new HashMap<>();//返回值
        upload.put("code", "");
        upload.put("msg", "");
        Response<ResponseBody> response = ocrApi.downloadFile(fileUrl, fileName, "1");
        boolean successful = response.isSuccessful();
        int code = response.code();
        if(successful && code == 200){
            ResponseBody responseBody = response.body();
            //上传受理平台
            if(responseBody != null){
                byte[] bytes = responseBody.bytes();
                if(bytes.length > 0){
                    HashMap<String, RequestBody> map  = new HashMap<>();
                    map.put("uid", RequestBody.create(MediaType.parse("text/plain"), "3336"));//固定值,3336
                    map.put("type", RequestBody.create(MediaType.parse("text/plain"), "doc"));//固定值,doc
                    map.put("folder_name", RequestBody.create(MediaType.parse("text/plain"), "//"));//固定值,//

                    RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpg"), bytes);
                    MultipartBody.Part body = MultipartBody.Part.createFormData("file", URLEncoder.encode(fileName, "UTF-8"), requestFile);
                    upload = applyApi.upload("http://10.224.12.76:8084/WebDiskServerDemo/upload", body, map);
                    logger.info("文件上传结果:"+ upload);
                } else {
                    logger.error("下载文件失败,内容为空:"+ fileUrl);
                }
            }
        } else {
            String msg = "下载文件接口调用失败:"+ fileUrl;
            if(response.errorBody() != null){
                msg = msg + ",ErrorMsg:"+ response.errorBody().string();
            }
            logger.error(msg);
        }
        return upload;
    }

}