package cn.timer.api.controller.insure;

//import cn.timer.api.bean.insure.InsuredUser;
import cn.timer.api.bean.qyzx.QyzxEntInfoM;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.utils.*;
import com.alibaba.druid.util.Base64;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.beust.jcommander.internal.Lists;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.google.common.collect.Maps;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

import com.alibaba.fastjson.JSONObject;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @Description TODO
 * @Author wgd
 * @Date 2022/3/1 11:34
 */
@Api(tags = "8.0保险列表")
@RestController
@Transactional
@RequestMapping(value = "/insure", produces = {"application/json"})
public class InsureContorll {
    private static final Logger log = LoggerFactory.getLogger(InsureContorll.class);
    /*测试用*/
    private static String appid = "1002303100602312445";
    /*测试用*/
    private static String secret = "acb329868c31d5b3ba03de40dac13dd9";

    /*保全测试用*/
    private static String appidq="1000115041006006938";
    /*保全测试用*/
    private static String secretq="6ba1bf4aa0bd14368c95ff0b9934a17b";


    /*测试用投保上传文件地址*/
    private static String uploadUrl = " http://sandbox.portal.unistar-ins.com/service/Home/Index/fileUpload";
    /*测试用投保申请地址*/
    private static String insuredUrl = "http://sandbox.portal.unistar-ins.com/mall/Home/Index/createQuotePolicy";
    /*测试用保全上传文件地址*/
    private static String uploadUrl2 = "http://sandbox.portal.unistar-ins.com/fuli/Home/Index/file_upload";


    /**
     * 设置请求参数
     * @param sign
     * @return
     */
    private Map setParams(String sign){
        /*当前时间戳*/
        long timestamp =System.currentTimeMillis()/1000;
        log.info("时间戳"+timestamp);
        Map paramsMap = Maps.newHashMap();
        paramsMap.put("pid",appid);
        paramsMap.put("timestamp",String.valueOf(timestamp));
        paramsMap.put("trace_id",appid+timestamp+ new Random().nextInt((9999 - 100) + 1) + 10);
//        paramsMap.put("sign",Md5.md5(appid+secret+timestamp+sign.trim()));

        String value=appid+secret+timestamp+sign;
        log.info("body参数======"+sign);
        paramsMap.put("sign", DigestUtils.md5Hex(value));
        log.info("params参数======"+JSONObject.toJSONString(paramsMap));
        return paramsMap;
    }
    /*保全*/
    private Map setParams2(String sign){
        /*当前时间戳*/
        long timestamp =System.currentTimeMillis()/1000;
        log.info("时间戳"+timestamp);
        Map paramsMap = Maps.newHashMap();
        paramsMap.put("pid",appidq);
        paramsMap.put("timestamp",String.valueOf(timestamp/1000));
        paramsMap.put("trace_id",appidq+timestamp+ new Random().nextInt((9999 - 100) + 1) + 10);
//        paramsMap.put("sign",Md5.md5(appidq+secret+timestamp+sign.trim()));

        String value=appidq+secretq+timestamp+sign;
        log.info("body参数======"+sign);
        paramsMap.put("sign", DigestUtils.md5Hex(value));
        log.info("params参数======"+JSONObject.toJSONString(paramsMap));
        return paramsMap;
    }

    @PostMapping(value = "/insured_add")
    @ApiOperation(value = "1.投保申请", httpMethod = "Post", notes = "投保申请")
    @ApiOperationSupport(order = 2)
    public Result<Object> insured_add(@CurrentUser UserBean userBean, @RequestParam(required = true) String url) {
        QyzxEntInfoM qyzxEntInfoM = QyzxEntInfoM.builder().id(userBean.getOrgCode()).build().selectById(); // 企业信息
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime now = LocalDateTime.now();
        Map bodyMap = Maps.newHashMap();
        ArrayList<Map> quotationsArry = new ArrayList<Map>();
        bodyMap.put("is_ss",0);
        Map quotations=Maps.newHashMap();
        quotations.put("trans_id","MB_"+dtf2.format(now));/*报价请求流水号*/
        quotations.put("applicant_type","2");/*投保人类型:2-企业*/
        quotations.put("quotation_type",3);/*报价类型:3-投保申请*/
        quotations.put("currency","5");/*币种:5人民币*/
        quotations.put("source_type","");/*币种:5人民币*/
        quotations.put("cps_email","");/*币种:5人民币*/
        quotations.put("cps_tel","");/*币种:5人民币*/
        quotations.put("last_serial_number","");/*币种:5人民币*/
        quotations.put("from_source","");/*币种:5人民币*/
        quotations.put("operator_name","");/*币种:5人民币*/

        Map basicMap = Maps.newHashMap();
        basicMap.put("partner_pid","1231");/*分销商pid*/
        basicMap.put("plan_code_id","61b85207b73d2ab09fb2959");/*计划代码,选项值:61b85207b73d2ab09fb2959 (生产环境) 61b85207b73d2ab09fb2959 (沙箱环境)*/
        basicMap.put("product_code_id","61b85207a9f87da19fb5986");/*产品代码,选项值:61b85207a9f87da19fb5986 (生产环境) 61b85207a9f87da19fb5986 (沙箱环境)*/
        basicMap.put("policy_date_start","2022-04-01 00:00:00");
        basicMap.put("policy_date_end","2022-4-30 23:59:59");
        basicMap.put("channel","");
        basicMap.put("fee","");
        basicMap.put("partner_user_rate","");
        basicMap.put("promotion_fee","");
        basicMap.put("agent_id","");
        basicMap.put("policy_insure_notify","");
        basicMap.put("promotion_id",0);
        basicMap.put("policy_number_last_year","");
        quotations.put("basic",basicMap);
        quotations.put("individual_applicant",Maps.newHashMap());

        /*企业信息*/
        Map companyApplicantMap = Maps.newHashMap();
        companyApplicantMap.put("applicant_e_name","测试企业一");/*企业/网点名称*/
        companyApplicantMap.put("applicant_e_address", "测试地址");/*企业/网点地址*/
        companyApplicantMap.put("applicant_e_contacts", "测试人");/*企业授权操作人姓名*/
        companyApplicantMap.put("applicant_e_phone", "13800138000");/*操作人的联系电话*/
        companyApplicantMap.put("applicant_e_no_type", "3646");/*企业证件类型*/
        companyApplicantMap.put("applicant_e_no", "91310230MA1JXL5059");/*企业证件号码*/
        companyApplicantMap.put("applicant_e_mail", "123@123.com");/*企业邮箱*/
        companyApplicantMap.put("applicant_province_city", "21721");/*省市区*/
        /*人员清单填被保人员*/
        companyApplicantMap.put("applicant_employee_list",url);
        quotations.put("company_applicant",companyApplicantMap);


        /*被保人员 填被保企业信息*/
        ArrayList<Map> insuredArray = new ArrayList<>();
        Map insured = Maps.newHashMap();
        insured.put("trans_id","P_"+qyzxEntInfoM.getId()+"_"+dtf2.format(now));
        insured.put("price","75");
        insured.put("insured_applicant_relations", "36960");
        insured.put("insured_mobile", qyzxEntInfoM.getLinkManPhone());
        insured.put("insured_e_contact", qyzxEntInfoM.getLinkMan());
        insured.put("insured_name", qyzxEntInfoM.getName());
        insured.put("insured_no_type", "3306");
        insured.put("insured_no", qyzxEntInfoM.getCreditCode());
        insured.put("insured_zm_openid", "");
        insured.put("benefit_basic_plan", "36969");
        insured.put("benefit_occupation_category", "63119");
        insured.put("benefit_EL_employee_number_t", "5");
        insuredArray.add(insured);
        quotations.put("insured",insuredArray);



        /*quotations.put("bd_id","");不需要*/
        quotations.put("file",Lists.newArrayList());
        quotations.put("specifically_agreed_file", Lists.newArrayList());
        quotations.put("policy_no", "");
        quotations.put("callback_policy", "/callBack/insuredCallBack");
        quotations.put("insured",insuredArray);
        quotationsArry.add(quotations);
        bodyMap.put("quotations",quotationsArry);
        log.info(JSONObject.toJSONString(bodyMap));
        Object o=requestAgent(bodyMap);
        return ResultUtil.data(o);

    }
    /*测试用生产环境不需要*/
    synchronized private Object requestAgent(Map bodyMap ){
        String data= HttpUtils.sendPost(insuredUrl,setParams(JSONObject.toJSONString(bodyMap)),bodyMap);
        Map<String,Object> dataMap = JSONObject.parseObject(data);
        if (dataMap.get("errcode").toString().equals("suc")) {
            return dataMap.get("data");
        }else{
            if(dataMap.get("errcode").toString().equals("e1")&&dataMap.get("errmsg").toString().equals("出单中")){
                try {
                    Thread.sleep(30000);
                    requestAgent(bodyMap);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
            return dataMap.get("data");
        }
    }



    @PostMapping (value = "/file_upload")
    @ApiOperation(value = "3.投保上传文件", httpMethod = "Post", notes = "上传文件")
    @ApiOperationSupport(order = 2)
    public Result<Object> fileUpload(@CurrentUser UserBean userBean, @RequestParam(required = true) MultipartFile file) {
        if (file == null) {
            return ResultUtil.error("上传失败,请选择上传文件");
        }
        byte[] bytes =null;
        try {
            bytes=file.getBytes();
        } catch (IOException e) {
            e.printStackTrace();
            log.warn("文件转换Base64异常");
        }
        String fileBase64= Base64.byteArrayToBase64(bytes);
        /*body参数 begin*/
        Map bodyMap= Maps.newHashMap();
        bodyMap.put("app","mall");
        bodyMap.put("name",file.getName());
        bodyMap.put("file",fileBase64);
        /*end*/
        String data= HttpUtils.sendPost(uploadUrl,setParams(JSONObject.toJSONString(bodyMap)),bodyMap);
        log.info("请求返回的结果====="+data);
        /*文件流base64*/
        return ResultUtil.data(message(data));
    };
    @PostMapping (value = "/file_upload2")
    @ApiOperation(value = "3.保全上传文件", httpMethod = "Post", notes = "上传文件")
    @ApiOperationSupport(order = 2)
    public Result<Object> fileUpload2(@CurrentUser UserBean userBean, @RequestParam(required = true) MultipartFile file) {
        if (file == null) {
            return ResultUtil.error("上传失败,请选择上传文件");
        }
        byte[] bytes =null;
        try {
            bytes=file.getBytes();
        } catch (IOException e) {
            e.printStackTrace();
            log.warn("文件转换Base64异常");
        }
        String fileBase64= Base64.byteArrayToBase64(bytes);
        /*body参数 begin*/
        Map bodyMap= Maps.newHashMap();
//        bodyMap.put("app","mall");
//        bodyMap.put("name","劳务公司批增-月单(1).xlsx");
        bodyMap.put("file",fileBase64);
        /*end*/
        String data= HttpUtils.sendPost(uploadUrl2,setParams2(JSONObject.toJSONString(bodyMap)),bodyMap);
        log.info("请求返回的结果====="+data);
        /*文件流base64*/
        return ResultUtil.data(message(data));
    };

//    @PostMapping(value = "/baoquan")
//    @ApiOperation(value = "2.单个添加保全", httpMethod = "Post", notes = "上传文件")
//    @ApiOperationSupport(order = 2)
//    public Result<Object> baoquan_add(InsuredUser user) {
//return null;
//    }

    /**
     * 设置错误信息
     * @param data
     * @return
     */
    private Object message(String data){
        Map<String,Object> dataMap = JSONObject.parseObject(data);
        if (dataMap.get("errcode").toString().equals("suc")) {
            return dataMap.get("data");
        }
          return dataMap.get("errmsg");
        }

    @GetMapping(value = "/downExcel")
    @ApiOperation(value = "2.下载投保文件", httpMethod = "Get", notes = "下载投保文件")
    @ApiOperationSupport(order = 2)
    public void downExcel(@CurrentUser UserBean userBean, HttpServletRequest request, HttpServletResponse resp){
        LocalDate localDate = LocalDate.now();
        /*获取该企业下所有未投保员工*/
        List<YgglMainEmp> ygglMainEmpList = YgglMainEmp.builder().build().selectList(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode,userBean.getOrgCode())
                .eq(YgglMainEmp::getIsInsure,0));
        List list=Lists.newArrayList();
        for (YgglMainEmp y:ygglMainEmpList.subList(0,5)) {
            String[] arr =new String[]{String.valueOf(y.getId()),y.getName(),"身份证",y.getZjNum(),"50万意外/5万医疗/扩展24小时(A类)","","深圳名邦人力资源管理有限公司","无","A类"};
            list.add(arr);
        }
        String[] rowName=new String[]{"ID","name","ID_type","ID_number","Scheme_name","Date_start","Branch","Tricycle_frame_number","benefit_occupation_category"};
        /*随机抽取五名幸运用户投保*/
        OutputStream os = null;
        try {
            resp.setContentType("application/octet-stream");
            resp.setHeader("content-disposition", "attachment; filename=" + URLEncoder.encode(localDate+"_"+list.size()+"名人员清单.xlsx", "UTF-8"));
            resp.setCharacterEncoding("UTF-8");
            os = resp.getOutputStream();
            ExcelUtils.exportExcel(localDate+"_"+list.size()+"名人员清单.xlsx",rowName,list,os);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}