package com.starcharge.api;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.ihidea.component.api.v2.BaseResponse;
import com.ihidea.core.util.JSONUtilsEx;
import com.starcharge.api.remote.DataSyncRemote;
import com.starcharge.api.remote.OrderInformRemote;
import com.starcharge.wios.auth.dao.model.Account;
import com.starcharge.wios.auth.service.AccountService;
import com.starcharge.wios.auth.vo.LoginInfo;
import com.starcharge.wios.bo.OemBo;
import com.starcharge.wios.bo.api.BaseInfo;
import com.starcharge.wios.bo.api.OperateLog;
import com.starcharge.wios.bo.api.ResponseMessage;
import com.starcharge.wios.bo.api.WallBoxInstallLinks;
import com.starcharge.wios.dao.entity.Order;
import com.starcharge.wios.query.*;
import com.starcharge.wios.result.WorkTaskVO;
import com.starcharge.wios.service.OemService;
import com.starcharge.wios.service.OrderService;
import com.starcharge.wios.utils.HttpUtil;
import com.starcharge.wios.vo.OemVo;
import com.starcharge.wios.vo.TaskVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.nio.charset.Charset;
import java.util.*;

/**
 * 对外接口
 *
 * @author tzx
 */
@RestController
@RequestMapping("api2/external/")
@Api(tags = "对外接口")
public class OrderApi {

    public static final Logger logger = LoggerFactory.getLogger(OrderApi.class);

    @Autowired
    private OrderService orderService;
    @Autowired
    private DataSyncRemote dataSyncRemote;
    @Autowired
    private OemService oemService;
    @Autowired
    private AccountService accountService;

    @Autowired
    private OrderInformRemote orderInformRemote;


    /**
     * 获取token
     *
     * @param serviceCode  社会唯一编号
     * @param servicePhone 手机号
     * @return
     */
    @PostMapping(value = "/getToken")
    @ApiOperation(value = "获取token")
    public BaseResponse<Object> getToken(String serviceCode, String servicePhone) {
        if (StringUtils.isBlank(serviceCode)) {
            throw new RuntimeException("社会唯一编号不能为空");
        }
        if (StringUtils.isBlank(servicePhone)) {
            throw new RuntimeException("手机号不能为空");
        }
        OemBo condition = new OemBo();
        condition.setOrganizationCode(serviceCode);
        condition.setAccount(servicePhone);
        List<OemVo> list = oemService.getList(condition);
        if (list == null || list.isEmpty()) {
            throw new RuntimeException("无对应企业信息");
        }
        String token = DigestUtils.md5Hex(serviceCode + servicePhone);
        OemVo oemVo = list.get(0);

        OemBo oem = new OemBo();
        BeanUtils.copyProperties(oemVo, oem);
        oem.setToken(token);
        oemService.update(oem);

        return new BaseResponse<>(token);
    }

    /**
     * 添加订单
     *
     * @param orderQuery
     * @return
     */
    @PostMapping(value = "order/add")
    @ApiOperation(value = "添加订单信息")
    public BaseResponse<Object> orderAdd(HttpServletRequest request, OrderQuery orderQuery) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        OemBo condition = new OemBo();
        condition.setToken(token);
        List<OemVo> list = oemService.getList(condition);

        if (list.size() == 0) {
            throw new RuntimeException("token错误");
        }
        logger.info("接收参数[orderAdd]orderQuery:{}", JSONUtilsEx.serialize(orderQuery));
        Order order = new Order();
        BeanUtils.copyProperties(orderQuery, order);
        orderService.add(order);
        return new BaseResponse<>();
    }

    /**
     * 订单列表
     *
     * @param request
     * @param orderNo
     * @param pageNo
     * @param pageSize
     * @return
     */
    @PostMapping(value = "order/list")
    @ApiOperation(value = "订单详情")
    public BaseResponse<Object> orderLists(HttpServletRequest request, String orderNo, String pageNo, String pageSize) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        BaseResponse<LoginInfo> loginInfo = dataSyncRemote.accountLogin("18888888888", "123456");
        if (loginInfo.success()) {
            token = loginInfo.getData().getToken();
        }
        /*OemBo condition = new OemBo();
        condition.setToken(token);
        List<OemVo> oemVos = oemService.getList(condition);

        if (oemVos.size() == 0) {
            throw new RuntimeException("token错误");
        }*/
        logger.info("接收参数[orderLists]orderNo,pageNo,pageSize:{},{},{}", orderNo, pageNo, pageSize);
        List<WallBoxInstallLinks> list = Lists.newArrayList();

        CamsOrderQo camsOrderQo = new CamsOrderQo();
        //camsOrderQo.setId(orderNo);
        camsOrderQo.setPageIndex(Integer.parseInt(pageNo));
        camsOrderQo.setPageSize(Integer.parseInt(pageSize));
        camsOrderQo.setMenuId("1002");
        camsOrderQo.setIsPaged(true);
        camsOrderQo.setType(1);
        ResponseMessage<WorkTaskVO> data = dataSyncRemote.getWorkTask(token,camsOrderQo);
        List<Map<String, Object>> orderList = new ArrayList<>();
        if(data.getStatus()==0){
            orderList = data.getData().getTaskList();
        }
        for (Map<String,Object> order : orderList) {
            BaseInfo baseInfo = new BaseInfo();
            WallBoxInstallLinks wallBoxInstallLinks = new WallBoxInstallLinks();
            //基本信息
            ResponseMessage<Map<String, Object>> orderInfoData = dataSyncRemote.getOrderInfo(token,order.get("workId").toString(),null);
            if(orderInfoData.getData()!=null){
                Map<String, Object> orderInfo = orderInfoData.getData();
                baseInfo.setSubmitInstallStatus(isNull(orderInfo.get("expandStatus")));
                baseInfo.setDealer(isNull(orderInfo.get("oemAgentInfo")));
                baseInfo.setModel(isNull(orderInfo.get("vehicleModel")));
                baseInfo.setVin(isNull(orderInfo.get("vehicleChassisNo")));
            }

            //勘测详情
            ResponseMessage<Map<String, Object>> surveyData = dataSyncRemote.getOrderInfo(token,order.get("workId").toString(),1);
            if(surveyData.getData()!=null){
                Map<String, Object> survey = surveyData.getData();
                baseInfo.setColumnFlag(isNull(survey.get("needErectPile")));
            }

            //首联详情
            ResponseMessage<Map<String, Object>> firstData = dataSyncRemote.getConnectInfo(token,order.get("workId").toString());
            if(firstData.getData()!=null){
                Map<String, Object> first = firstData.getData();
                baseInfo.setOuterInnerFlag(isNull(first.get("installPosition")));
                baseInfo.setSubmitInstallFlag(isNull(first.get("electricExpand")));
            }


            //安装详情
            ResponseMessage<Map<String, Object>> installData = dataSyncRemote.getOrderInfo(token,order.get("workId").toString(),2);
            if(surveyData.getData()!=null){
                Map<String, Object> install = installData.getData();
                baseInfo.setCustomerRate(isNull(install.get("clientRate")));
                baseInfo.setElectronWorker(isNull(install.get("installStaffName")));
                baseInfo.setPileSn(isNull(install.get("wallboxNo")));
                baseInfo.setLineLength(isNull(install.get("realCableMeter")));
            }
            baseInfo.setAdditionalAmount("");
            baseInfo.setStatusLabel("");
            baseInfo.setRemarks("");
            baseInfo.setCountOfTestRefuse("");
            baseInfo.setCountOfInstallRefuse("");
            baseInfo.setCloseOrderReason("");
            baseInfo.setOrderNo(isNull(order.get("workId")));
            baseInfo.setCarCompanyOrderNo(isNull(order.get("outOrderId")));
            baseInfo.setCurrentStage(isNull(order.get("currentNode")));
            baseInfo.setOrderStatus(isNull(order.get("status")));
            baseInfo.setTimeoutType(isNull(order.get("overtimeType")));
            baseInfo.setOrderSource(isNull(order.get("orderSource")));
            baseInfo.setCreateDate(isNull(order.get("createTime")));
            baseInfo.setOrderRunTime(isNull(order.get("orderPeriod")));
            baseInfo.setRemainingTime(isNull(order.get("processTime")));
            baseInfo.setCurrentNodeTime(isNull(order.get("currentStartTime")));
            baseInfo.setCarFactory(isNull(order.get("oemName")));
            baseInfo.setRegionId(isNull(order.get("area")));
            baseInfo.setArea(isNull(order.get("area")));
            baseInfo.setProvince(isNull(order.get("area")));
            baseInfo.setCity(isNull(order.get("area")));
            baseInfo.setAddress(isNull(order.get("address")));
            baseInfo.setCarOwnerName(isNull(order.get("userName")));
            baseInfo.setCarOwnerTel(isNull(order.get("userPhone")));
            baseInfo.setPilePackage(isNull(order.get("packType")));
            baseInfo.setPileBrand(isNull(order.get("wallboxModel")));
            baseInfo.setBeforeSaleTestFlag(isNull(order.get("surveyBeforeSaleEnable")).equals("是")?"1":isNull(order.get("surveyBeforeSaleEnable")).equals("否")?"0":"");
            baseInfo.setInstallServiceCompany(isNull(order.get("installSupplierName")));
//            baseInfo.setParkNo("车位号");
//            baseInfo.setParkStatus("车位状态");
//            baseInfo.setInvoiceDate("发票日期");
//            baseInfo.setPileModel("墙盒型号");
//            baseInfo.setDealerName("经销商名称");
//            baseInfo.setDealerContactName("经销商联系人");
//            baseInfo.setDealerContactTel("经销商联系方式");
//            baseInfo.setHandlerFlag("是否需要人工派单");
//            baseInfo.setInvoiceNo("发票号");
//            baseInfo.setLongitude("经度");
//            baseInfo.setLatitude("纬度");
//            baseInfo.setMoveFlag("是否为移桩订单");
//            baseInfo.setParkEnv("车位环境:地下");

            wallBoxInstallLinks.setBaseInfo(baseInfo);
            List<OperateLog> logs = getOperateLogList();
            wallBoxInstallLinks.setOperateLogList(logs);
            wallBoxInstallLinks.setExtentInfo(null);
            list.add(wallBoxInstallLinks);
        }
        return new BaseResponse<>(list);
    }

    private String isNull(Object val) {
        if (val == null) {
            return "";
        } else {
            return val.toString();
        }
    }
    /**
     * 获取墙盒信息
     *
     * @param request
     * @param wallBoxNo
     * @return
     */
    @PostMapping(value = "order/wallBoxInfo")
    @ApiOperation(value = "获取墙盒信息")
    public BaseResponse<Object> orderAdd(HttpServletRequest request, String wallBoxNo) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        OemBo condition = new OemBo();
        condition.setToken(token);
        List<OemVo> oemVos = oemService.getList(condition);

        if (oemVos.size() == 0) {
            throw new RuntimeException("token错误");
        }
        Map<String, Object> map = new HashMap<>();
        map.put("id", "CA20210902093738sh010");
        map.put("installId", "CA20210902093738");
        map.put("userName", "王林(李先生) ");
        map.put("userPhone", "13820005759");
        map.put("outOrderId", "V2109020016380");
        map.put("installSupplierId", 3);
        map.put("installSupplierName", "服务商-空灵科技");
        return new BaseResponse<>(map);
    }

    private static List<OperateLog> getOperateLogList() {
        List<OperateLog> logs = Lists.newArrayList();
        for (int b = 0; b <= 2; b++) {
            OperateLog operateLog = new OperateLog();
            operateLog.setOperateNode("操作节点");
            operateLog.setOperator("操作人");
            operateLog.setStartTime("开始时间:yyyy-MM-dd HH:mm:ss");
            operateLog.setEndTime("完成时间:yyyy-MM-dd HH:mm:ss");
            operateLog.setResidentTime("停留时长");
            operateLog.setOperateRecord("操作记录");
            logs.add(operateLog);
        }
        return logs;
    }

    /**
     * 取消订单
     *
     * @param orderId
     * @param invoiceTimeStr
     * @return
     */
    @PostMapping(value = "order/cancel")
    @ApiOperation(value = "取消订单")
    public BaseResponse<Object> orderCancel(HttpServletRequest request, String orderId, String closeReason, String invoiceTimeStr) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        OemBo condition = new OemBo();
        condition.setToken(token);
        List<OemVo> oemVos = oemService.getList(condition);

        if (oemVos.size() == 0) {
            throw new RuntimeException("token错误");
        }
        logger.info("接收参数[orderCancel]取消订单号:{}", orderId);
        orderService.closeOrder(orderId, closeReason);
        return new BaseResponse<>();
    }


    /**
     * 新增维修单
     *
     * @param request
     * @param repairOrderQuery
     * @return
     */
    @PostMapping(value = "repairOrder/add")
    @ApiOperation(value = "新增维修单")
    public BaseResponse<Object> repairOrderAdd(HttpServletRequest request, RepairOrderQuery repairOrderQuery) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        OemBo condition = new OemBo();
        condition.setToken(token);
        List<OemVo> oemVos = oemService.getList(condition);

        if (oemVos.size() == 0) {
            throw new RuntimeException("token错误");
        }
        logger.info("接收参数[repairOrderAdd]order:{}", JSONUtilsEx.serialize(repairOrderQuery));
//        Map<String, Object> map = new HashMap<>();
//        map.put("id", "CA20210902093738sh010");
//        map.put("installId", "CA20210902093738");
//        map.put("userName", "王林(李先生) ");
//        map.put("userPhone", "13820005759");
//        map.put("outOrderId", "V2109020016380");
//        map.put("installSupplierId", 3);
//        map.put("installSupplierName", "服务商-空灵科技");
        return new BaseResponse<>();
    }

    /**
     * 维修单列表
     *
     * @param request
     * @param orderNo
     * @param pageNo
     * @param pageSize
     * @return
     */
    @PostMapping(value = "repairOrder/list")
    @ApiOperation(value = "维修单详情")
    public BaseResponse<Object> repairOrderList(HttpServletRequest request, String orderNo, Integer pageNo, Integer pageSize) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        OemBo condition = new OemBo();
        condition.setToken(token);
        List<OemVo> oemVos = oemService.getList(condition);

        if (oemVos.size() == 0) {
            throw new RuntimeException("token错误");
        }
        String ssoToken = "";
        // 获取 sso-token
        Integer accountId = oemVos.get(0).getWbAccountId();
        //        ssoToken = accountService.getReTokenByAccountId(accountId);
        //        模拟登录
        Account account = accountService.selectByPrimaryKey(accountId);
        BaseResponse<LoginInfo> loginInfo = dataSyncRemote.accountLogin("18888888888", "123456");
        if (loginInfo.success()) {
            ssoToken = loginInfo.getData().getToken();
            System.out.println("Token___:" + ssoToken);
            logger.info("接收参数[repairOrderList]orderNo,pageNo,pageSize:{},{},{}", orderNo, pageNo, pageSize);
            FlowQuery query = new FlowQuery();
            query.setIsPaged(true);
            query.setPageSize(pageNo==null?1:pageNo);
            query.setPageIndex(pageSize==null?10:pageSize);
            ResponseMessage<TaskVo> obj = dataSyncRemote.toWmsSyncBill(ssoToken, query);
            if (obj.getStatus() == 0) {
                return new BaseResponse<>(obj.getData().getTaskList());
            }
            return new BaseResponse<>();
        }


        return new BaseResponse<>();
    }

    /**
     * 维修单关闭
     *
     * @return
     */
    @PostMapping(value = "repairOrder/closeFlow")
    @ApiOperation(value = "维修单关闭")
    public BaseResponse<Object> closeFlow(HttpServletRequest request, String wordkerOrderId, String orderId, String endReason) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        BaseResponse<LoginInfo> loginInfo = dataSyncRemote.accountLogin("18888888888", "123456");
        if (loginInfo.success()) {
            token = loginInfo.getData().getToken();
        }
        InstalltionEndreasonNotificationBO orderInformBO = new InstalltionEndreasonNotificationBO();
        orderInformBO.setWordkerOrderId(wordkerOrderId);
        orderInformBO.setOrderId(orderId);
        orderInformBO.setEndReason(endReason);
        orderInformRemote.installtionEndreasonNotification(token, orderInformBO);
        Map<String,Object> res = new HashMap<>();
        res.put("wordkerOrderId",wordkerOrderId);
        res.put("orderId",orderId);
        res.put("endReason",endReason);
        return new BaseResponse<>(res);
    }

    /**
     * 维修单关闭
     *
     * @return
     */
    @PostMapping(value = "repairOrder/submitFlow")
    @ApiOperation(value = "维修单完结")
    public BaseResponse<Object> submitFlow(HttpServletRequest request, String workorderId, String orderId) {
        String token = request.getHeader("token");
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("token不能为空");
        }
        BaseResponse<LoginInfo> loginInfo = dataSyncRemote.accountLogin("18888888888", "123456");
        if (loginInfo.success()) {
            token = loginInfo.getData().getToken();
        }
        OrderInformBO orderInformBO = new OrderInformBO();
        orderInformBO.setWorkorderId(workorderId);
        orderInformBO.setOrderId(orderId);
        orderInformRemote.installtionStatusNotification(token,orderInformBO);
        Map<String,Object> res = new HashMap<>();
        res.put("workorderId",workorderId);
        res.put("orderId",orderId);
        return new BaseResponse<>(res);
    }
}