package com.boco.nbd.wios.flow.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.boco.nbd.framework.common.ResponseMessage2;
import com.boco.nbd.wios.export.PoiUtil;
import com.boco.nbd.wios.flow.entity.bo.ManualSapBo;
import com.boco.nbd.wios.flow.entity.po.OrderAbnormalPO;
import com.boco.nbd.wios.flow.entity.po.OrderPO;
import com.boco.nbd.wios.flow.enums.OrderInfoEnum;
import com.boco.nbd.wios.flow.mapper.def.FlowOrderMapper;
import com.boco.nbd.wios.flow.service.IOrderAbnormalService;
import com.boco.nbd.wios.flow.service.IOrderService;
import com.boco.nbd.wios.flow.service.impl.OrderServiceImpl;
import com.boco.nbd.wios.flow.util.ProcessUtil;
import com.boco.nbd.wios.flow.util.ValidUtil;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.boco.nbd.wios.flow.entity.pdf.BlockPairBo;
import com.boco.nbd.wios.manage.entity.bo.MaterialsEx;
import com.boco.nbd.wios.manage.entity.bo.OrderVo;
import com.boco.nbd.wios.manage.mapper.extdb.MaterialsMapperEx;
import com.boco.nbd.wios.manage.service.impl.OrderInvoiceService;
import com.ihidea.core.support.session.SessionInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Description 订单管理处理类
 * @Author Yu
 * @Date 2022/7/11
 */
@RestController
@Slf4j
@RequestMapping("/camsOrder")
@Api(tags = "新版本订单管理接口")
public class FlowOrderController {

    @Autowired
    private IOrderService orderService;

    @Autowired
    private IOrderAbnormalService orderAbnormalService;

    @Autowired
    private OrderInvoiceService orderInvoiceService;
    @Resource
    MaterialsMapperEx materialsMapperEx;

    @PostMapping(value = "order/pushSapOrder")
    @ApiOperation(value = "同步订单到sap")
    public ResponseMessage2 pushSapOrder(@RequestBody ManualSapBo bo) {
        try {
            orderService.pushSapOrder(bo);
            return ResponseMessage2.Success2(bo.getId() + "重推SAP成功。");
        } catch (Exception ex) {
            return ResponseMessage2.Failed(bo.getId() + "重推SAP失败:" + ex.getMessage());
        }
    }

    /**
     * 批量更新开票信息
     *
     * @param invoiceJson
     * @return
     */
    @PostMapping(value = "orderInvoice/batchUpdate")
    @ApiOperation(value = "批量更新开票信息", notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "invoiceJson", value = "json数据", dataType = "String", paramType = "query", required = true),})
    public ResponseMessage2 batchImportInvoiceData(String invoiceJson) {
        if (StrUtil.isEmpty(invoiceJson)) {
            return ResponseMessage2.Failed("缺少参数");
        }
        try {
            orderInvoiceService.processBatchUpdate(invoiceJson);
        } catch (Exception ex) {
            return ResponseMessage2.Failed(ex.getMessage());
        }

        return ResponseMessage2.Success();
    }

    @ApiOperation("获取工单信息:type=1 勘测详情;type=2 安装详情;type缺失或者其它值 基本信息")
    @GetMapping(value = "/getOrderInfo")
    public ResponseMessage2 getOrderInfo(@RequestParam(value = "id") String id, @RequestParam(value = "type", required = false) Integer type) {
        try {
            OrderInfoEnum infoEnum = OrderInfoEnum.getEnum(type);
            return ResponseMessage2.Success2(orderService.getOrderInfo(id, infoEnum));
        } catch (Exception ex) {
            return ResponseMessage2.Failed("getOrderInfo:" + ex.getMessage());
        }
    }

    @GetMapping(value = "exportOrderDocx.do")
    @ApiOperation(value = "导出工单Docx,type=1 勘测详情;type=2 安装详情;===>调整成前端实现")
    @ApiIgnore
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "工单Id", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "type", value = "类型", dataType = "Integer", paramType = "query", required = true)})
    public void exportOrderDocx(HttpServletResponse response, String id, Integer type) throws Exception {
        OrderInfoEnum infoEnum = OrderInfoEnum.getEnum(type);
        if (OrderInfoEnum.BASE_INFO.equals(infoEnum)) {
            infoEnum = OrderInfoEnum.SURVEY_INFO;
        }
        Map<String, Object> dataMap = orderService.getOrderInfo(id, infoEnum);
        String fileName = OrderInfoEnum.SURVEY_INFO.equals(infoEnum) ? WiosConstant.SURVEY_ORDER_DOCX : WiosConstant.INSTALL_ORDER_DOCX;
        String templateName = OrderInfoEnum.SURVEY_INFO.equals(infoEnum) ? WiosConstant.SURVEY_ORDER_DOCX_TEMPLATE : WiosConstant.INSTALL_ORDER_DOCX_TEMPLATE;
        PoiUtil.exportOrderDocx(response, dataMap, fileName, templateName);

    }


    @PostMapping("order/add")
    @ApiOperation(value = "订单管理-添加派单信息")
    public ResponseMessage2 add(OrderPO order) {
        OrderAbnormalPO orderAbnormalPO = new OrderAbnormalPO();
        BeanUtil.copyProperties(order, orderAbnormalPO);
        SessionInfo sessionInfo = ProcessUtil.getUserInfo();
        if (sessionInfo == null) {
            return ResponseMessage2.Failed(ProcessUtil.RE_LOGIN);
        }
        order.setCreateAccount(sessionInfo.getUserId());
        order.setCreateAccountName(sessionInfo.getUserName());
        //车主姓名
        if (StringUtils.isBlank(order.getUserName()) ||
                //车主电话
                !ValidUtil.isMobileSimple(order.getUserPhone()) ||
                //车型
                StringUtils.isBlank(order.getVehicleModel()) ||
                //主机厂
                StringUtils.isBlank(order.getOemName()) ||
                //主机厂业务代码
                order.getOemId() == null ||
                //是否需要人工派单
                order.getManuDispatchEnable() == null ||
                //区域
//                StringUtils.isBlank(order.getArea()) ||
                //安装地址
                StringUtils.isBlank(order.getAddress()) ||
                //是否为售车前预勘测
                order.getSurveyBeforeSaleEnable() == null ||
                //是否联系上客户
                order.getIsConnect() == null ||
                //是否需要勘测
                order.getIsNeedSurvey() == null ||
                //安装紧急程度
                order.getInstallEmergencyLevel() == null) {

            orderAbnormalService.insertSelective(orderAbnormalPO);
            return ResponseMessage2.Failed("异常订单");
        }
        return orderService.startFlow(order);
    }

    @GetMapping("order/getOemCascade")
    @ApiOperation(value = "订单管理-主机厂和套包类型级联关系")
    @ApiImplicitParams({@ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = true)
    })
    public ResponseMessage2 getOemCascade(String oemId) {
        return ResponseMessage2.Success2(orderService.getOemCascade(oemId));
    }

    /**
     * @Description 订单附件生成pdf
     * @Param
     * @author miaoguoqing
     * @date 2022/10/27
     */
    @PostMapping(value = "order/autogeneratePdf")
    @ApiOperation(value = "订单附件生成pdf")
    public void getAutogeneratePdf(@RequestBody BlockPairBo blockPairBo, HttpServletResponse response) throws IOException {
        try {
            orderService.getAutogeneratePdf(blockPairBo, response);
        } catch (Exception e) {
            log.error("生成PDF失败!", e);
            throw new IOException(e.getMessage());
        }
    }
    @Autowired
    private FlowOrderMapper flowOrderMapper;

    @GetMapping("/getCanDeliveryOrder")
    @ApiOperation("获取可以发货的订单列表")
    public ResponseMessage2 getCanDeliveryOrder(@RequestParam String orderId,@RequestParam String  isproduct){
        List<OrderVo> list=flowOrderMapper.getCanDeliveryOrder(orderId,"品牌墙盒".equals(isproduct));
        list.stream().forEach(i->{
            MaterialsEx materials=materialsMapperEx.materialsByMaterialsCode(i.getItemModel());
           if (materials!=null){
               i.setMaterialName(materials.getMaterialsName());
           }
        });
        return ResponseMessage2.Success2(list);
//        if ("品牌墙盒".equals(isproduct)){
//            List<OrderVo> has = list.stream().filter(i -> i.getInstallWallboxModel().equals("CAMS")).collect(Collectors.toList());
//            return ResponseMessage2.Success2(has);
//        }else {
//            //List<OrderPO> has = list.stream().filter(i -> !i.getInstallWallboxModel().equals("CAMS")).collect(Collectors.toList());
//            return ResponseMessage2.Success2(list);
//        }
    }
}