package com.winsun.TimingTask;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.winsun.bean.Order;
import com.winsun.bean.OrderHistory;
import com.winsun.mapper.OrderHistoryMapper;
import com.winsun.mapper.OrderMapper;
import com.winsun.outSideSystem.IntelligenceSendOrder;
import com.winsun.smsUtils.SendSmsAndMail;
import com.winsun.utils.MyBatisPlusUpdateUtils;
import com.winsun.utils.XbkUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
@Configuration
@EnableScheduling
public class OrderTask {
    private static OrderMapper orderMapper;

    @Autowired
    private IntelligenceSendOrder intelligenceSendOrder;

    @Autowired
    private OrderHistoryMapper orderHistoryMapper;

    @Autowired
    public OrderTask(OrderMapper orderMapper) {
        OrderTask.orderMapper = orderMapper;
    }

    /**
     * 定时器更新已送货订单
     */
    @Scheduled(cron = "0 0/5 * * * ? ")
    public void updateBeSendOrder() {
        log.info("开始更新已发货超过7天订单");
        int i = orderMapper.updateCompleteOrder();
        log.info("更新已送货订单成功：" + i);
    }

    /**
     * 定时器更新智能平台状态
     */
    @Scheduled(cron = "0 0/5 * * * ?")
//    @Scheduled(fixedRate=28800000)
    public void updateStatus() {

        // 获取审核中的订单
        Wrapper<Order> wrapper = new EntityWrapper<>();
        wrapper.eq("order_status", "审核中");
        List<Order> orders = orderMapper.selectList(wrapper);

        // 循环请求获取数据
        for(Order order : orders) {
            if (StringUtils.isNotBlank(order.getKdOrderId())) {
                String s = intelligenceSendOrder.queryStatus(order.getKdOrderId(), null);
                if (StringUtils.isNotBlank(s)) {
                    Order update = new Order();
                    update.setId(order.getId());
                    update.setUpdateTime(new Date());

                    JSONObject json = JSONObject.parseObject(s);
                    OrderHistory orderHistory = new OrderHistory();
                    orderHistory.setOrderId(order.getId());
                    orderHistory.setCreateDate(new Date());
                    orderHistory.setStatus("智能平台状态获取");

                    // 未获取到需要的状态不做更新
                    if ("归档".equals(json.get("orderStatus")) || "受理成功【待收费】".equals(json.get("orderStatus"))
                        || "已收费【待竣工】".equals(json.get("orderStatus")) || "受理成功".equals(json.get("orderStatus"))) {
                        orderHistory.setStatus("订单已完成");
                        orderHistoryMapper.insert(orderHistory);

                        update.setThStatus(json.get("orderStatus").toString());
                        update.setOrderStatus("已完成");
                        orderMapper.updateById(update);

                        // 下发短信
                        SendSmsAndMail.sendSms2(order.getContactNumber(),
                                order.getNetNumber(),
                                order.getNetPassword(), "12");
                    }else if("作废".equals(json.get("orderStatus")) || "受理异常".equals(json.get("orderStatus"))){
                        orderHistory.setStatus("订单异常请联系管理员");
                        orderHistoryMapper.insert(orderHistory);

                        update.setThStatus(json.get("orderStatus").toString());
                        update.setOrderStatus("异常单");
                        orderMapper.updateById(update);
                    }
                }
            }
        }
    }

    @Scheduled(cron = "0 0 0 * * ? ")
    //@Scheduled(cron = "0/5 * * * * ? ")
    //@Scheduled(fixedRate=1000*60)
    @PostMapping("/orderTask")
    public void general() throws ParseException {
        log.info("更新小白卡订单");
        Wrapper<Order> wrapper = new EntityWrapper();
        wrapper.eq("order_status", "待识别");
        List<Order> orders = orderMapper.selectList(wrapper);
        orders.forEach(order -> {
            try {
                Map<String, Object> dataMapping = new HashMap<>();
                JSONObject jsonObject = XbkUtil.orderInfoJT0006(order.getXbOrderId());
                String dataArray = jsonObject.getString("dataArray");
                Map<String,Object> Map = JSON.parseObject(dataArray, HashMap.class);
                Wrapper<Order> wrapper1 = new EntityWrapper();
                wrapper1.eq("xb_order_id",Map.get("orderCode"));
                wrapper1.eq("id",order.getId());
                if(Map.get("orderState").toString().equals("3") || Map.get("orderState").toString().equals("13") ||
                        Map.get("orderState").toString().equals("8") || Map.get("orderState").toString().equals("22") ||
                        Map.get("orderState").toString().equals("21") ){
                    dataMapping.put("order_status", "待处理");
                }
                if(Map.get("orderState").toString().equals("10") || Map.get("orderState").toString().equals("11")){
                    dataMapping.put("order_status", "异常单");
                    dataMapping.put("success_time", new Date());
                }
                orderMapper.updateForSet(MyBatisPlusUpdateUtils.toUpdateSet(dataMapping), wrapper1);
                log.info(order.getXbOrderId()+"订单已更新");
            } catch (Exception e) {
                log.error(order.getXbOrderId()+"订单更新失败",e.getMessage());
            }
        });

        Wrapper<Order> wrapper2 = new EntityWrapper();
        wrapper2.eq("order_status", "待活体");
        List<Order> orders1 = orderMapper.selectList(wrapper);
        orders1.forEach(order -> {
            try {
                JSONObject jsonObject = XbkUtil.orderInfoJT0006(order.getXbOrderId());
                String dataArray = jsonObject.getString("dataArray");
                Map<String,Object> Map = JSON.parseObject(dataArray, HashMap.class);
                Wrapper<Order> wrapper1 = new EntityWrapper();
                wrapper1.eq("xb_order_id",Map.get("orderCode"));
                wrapper1.eq("id",order.getId());
                Map<String, Object> dataMapping = new HashMap<>();
                if(Map.get("orderState").toString().equals("3") || Map.get("orderState").toString().equals("13")){
                    dataMapping.put("order_status", "已完成");
                }
                if(Map.get("orderState").toString().equals("10") || Map.get("orderState").toString().equals("11")){
                    dataMapping.put("order_status", "异常单");
                }
                dataMapping.put("success_time", new Date());
                orderMapper.updateForSet(MyBatisPlusUpdateUtils.toUpdateSet(dataMapping), wrapper1);
                log.info(order.getXbOrderId()+"订单已更新");
            } catch (Exception e) {
                log.error(order.getXbOrderId()+"订单更新失败",e.getMessage());
            }
        });

    }

}
