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

import cn.hutool.core.date.DateUtil;
import com.boco.nbd.framework.common.ResponseMessage2;
import com.boco.nbd.wios.flow.enums.FlowNodeEnum;
import com.boco.nbd.wios.flow.service.IHolidayService;
import com.boco.nbd.wios.flow.service.IStatisticsService;
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.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @Description: TODO
 * @Author: ZQY
 * @Date: 2022/8/16
 **/
@RestController
@Slf4j
@RequestMapping("statistics")
@Api(tags = "大屏统计接口")
public class StatisticsController {

    @Autowired
    private IStatisticsService statisticsService;

    @Autowired
    private IHolidayService holidayService;


    /**
     * 提供大屏页面订单总数接口
     * @return
     */
    @ApiOperation(value = "提供大屏页面订单总数接口")
    @GetMapping(value = "/getOrderQuantity")

    @ApiImplicitParams({@ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "startTime", value = "开始时间yyy-mm-dd", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "endTime", value = "结束时间yyy-mm-dd", dataType = "String", paramType = "query", required = false)})

    public ResponseMessage2 getOrderQuantity(String oemId,String startTime,String endTime){
        return ResponseMessage2.Success2(statisticsService.getOrderQuantity(oemId,startTime,endTime));
    }


    /**
     * 提供大屏页面省份订单总数接口
     * @return
     */
    @ApiOperation(value = "提供大屏页面省份订单总数接口")
    @GetMapping(value = "/getProvinceOrderQuantity")
    @ApiImplicitParams({@ApiImplicitParam(name = "orderQuantityType", value = "大屏数据类型 1:派发订单总量 2:安装订单总数 3:新增当天订单总数 4:完成当天订单总数 5:新增当月订单总数 6:完成当月订单总数 ", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "startTime", value = "开始时间yyy-mm-dd", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "endTime", value = "结束时间yyy-mm-dd", dataType = "String", paramType = "query", required = false)})
    public ResponseMessage2 getProvinceOrderQuantity(String orderQuantityType,String oemId,String startTime,String endTime){
        return ResponseMessage2.Success2(statisticsService.getProvinceOrderQuantity(orderQuantityType,oemId,startTime,endTime));
    }


    /**
     * 提供大屏页面订单总数接口
     * @return
     */
    @ApiOperation(value = "提供大屏页面省份钻取地市订单总数接口")
    @GetMapping(value = "/getAreaOrderQuantity")
    @ApiImplicitParams({@ApiImplicitParam(name = "orderQuantityType", value = "大屏数据类型 1:派发订单总量 2:安装订单总数 3:新增当天订单总数 4:完成当天订单总数 5:新增当月订单总数 6:完成当月订单总数 ", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "provinceId", value = "省份id", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "startTime", value = "开始时间yyy-mm-dd", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "endTime", value = "结束时间yyy-mm-dd", dataType = "String", paramType = "query", required = false)})
    public ResponseMessage2 getAreaOrderQuantity(String orderQuantityType,String provinceId,String oemId,String startTime,String endTime){
        Map<String,String> map = statisticsService.getAreaOrderQuantity(orderQuantityType,provinceId,oemId,startTime,endTime);
        return ResponseMessage2.Success2(map.isEmpty() ? "":map);
    }


    /**
     * 获取每个月新增的订单总数同比接口
     * @return
     */
    @ApiOperation(value = "获取每个月新增的订单总数同比接口")
    @GetMapping(value = "/getMonthOrderQuantity")

    @ApiImplicitParams({@ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = false)})
    public ResponseMessage2 getMonthOrderQuantity(String oemId){
        return ResponseMessage2.Success2(statisticsService.getMonthOrderQuantity(oemId));
    }


    /**
     * 获取每个月完成的订单总数同比接口
     * @return
     */
    @ApiOperation(value = "获取每个月完成的订单总数接口")
    @GetMapping(value = "/getFinishMonthOrderQuantity")

    @ApiImplicitParams({@ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = false)})
    public ResponseMessage2 getFinishMonthOrderQuantity(String oemId){
        return ResponseMessage2.Success2(statisticsService.getFinishMonthOrderQuantity(oemId));
    }

    /**
     * 获取时效统计
     * @return
     */
    @ApiOperation(value = "获取时效统计")
    @GetMapping(value = "/getNodeFlagTime")
    public ResponseMessage2 getNodeFlagTime()  {
        List<String> holidayPOList= holidayService.getListByType("节假日");
        List<String> workList= holidayService.getListByType("调休工作日");

        String[] workdayArr = holidayPOList.toArray(new String[0]);
        String[] naturalArr = workList.toArray(new String[0]);

        //首联时效
        float time101 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_101.getKey()+"-"+FlowNodeEnum.NODE_101.getValue(),FlowNodeEnum.NODE_102.getKey()+"-"+FlowNodeEnum.NODE_102.getValue(),FlowNodeEnum.NODE_102.getKey(),workdayArr,naturalArr);
        //勘测预约时效
        float time104 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_103.getKey()+"-"+FlowNodeEnum.NODE_103.getValue(),FlowNodeEnum.NODE_105.getKey()+"-"+FlowNodeEnum.NODE_105.getValue(),FlowNodeEnum.NODE_104.getKey(),workdayArr,naturalArr);
        //勘测时效
        float time107 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_105.getKey()+"-"+FlowNodeEnum.NODE_105.getValue(),FlowNodeEnum.NODE_107.getKey()+"-"+FlowNodeEnum.NODE_107.getValue(),FlowNodeEnum.NODE_107.getKey(),workdayArr,naturalArr);
        //勘测审核时效
        float time108 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_107.getKey()+"-"+FlowNodeEnum.NODE_107.getValue(),FlowNodeEnum.NODE_108.getKey()+"-"+FlowNodeEnum.NODE_108.getValue(),FlowNodeEnum.NODE_108.getKey(),workdayArr,naturalArr);
        //安装预约时效
        float time110 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_108.getKey()+"-"+FlowNodeEnum.NODE_108.getValue(),FlowNodeEnum.NODE_110.getKey()+"-"+FlowNodeEnum.NODE_110.getValue(),FlowNodeEnum.NODE_110.getKey(),workdayArr,naturalArr);
        //安装时效
        float time112 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_108.getKey()+"-"+FlowNodeEnum.NODE_108.getValue(),FlowNodeEnum.NODE_112.getKey()+"-"+FlowNodeEnum.NODE_112.getValue(),FlowNodeEnum.NODE_112.getKey(),workdayArr,naturalArr);
        //安装审核时效
        float time113 = statisticsService.getNodeFlagTime(FlowNodeEnum.NODE_112.getKey()+"-"+FlowNodeEnum.NODE_112.getValue(),FlowNodeEnum.NODE_113.getKey()+"-"+FlowNodeEnum.NODE_113.getValue(),FlowNodeEnum.NODE_113.getKey(),workdayArr,naturalArr);


        Map<String,Float> nodeFlagTimeMap=new HashedMap();
        nodeFlagTimeMap.put("首联时效", time101==0 ? (float) 0.01 :time101);
        nodeFlagTimeMap.put("勘测预约时效",time104==0 ? (float) 0.01 :time104);
        nodeFlagTimeMap.put("勘测时效",time107==0 ? (float) 0.01 : time107);
        nodeFlagTimeMap.put("勘测审核时效",time108==0 ? (float) 0.01 : time108);
        nodeFlagTimeMap.put("安装预约时效",time110==0 ? (float) 0.01 : time110);
        nodeFlagTimeMap.put("安装时效",time112==0 ? (float) 0.01 : time112);
        nodeFlagTimeMap.put("安装审核时效",time113==0 ? (float) 0.01 : time113);

        return ResponseMessage2.Success2(nodeFlagTimeMap);
    }



    @ApiOperation(value = "根据服务商查询评分")
    @GetMapping(value = "/getScoreSupplierBySupplier")
    public ResponseMessage2 getScoreSupplierBySupplier()  {
        return ResponseMessage2.Success2(statisticsService.getScoreSupplierBySupplier());
    }


    @ApiOperation(value = "根据区域查询评分")
    @GetMapping(value = "/getScoreSupplierByRegion")
    public ResponseMessage2 getScoreSupplierByRegion()  {
        return ResponseMessage2.Success2(statisticsService.getScoreSupplierByRegion());
    }



    @ApiOperation(value = "区域完成占比")
    @GetMapping(value = "/getOrderQuantityGroupArea")
    @ApiImplicitParams({@ApiImplicitParam(name = "oemId", value = "主机厂ID", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "startTime", value = "开始时间yyy-mm-dd", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "endTime", value = "结束时间yyy-mm-dd", dataType = "String", paramType = "query", required = false)})
    public ResponseMessage2 getOrderQuantityGroupArea(String oemId,String startTime,String endTime)  {
        return ResponseMessage2.Success2(statisticsService.getOrderQuantityGroupArea(oemId,startTime,endTime));
    }

    @ApiOperation(value = "本月满意度")
    @GetMapping(value = "/getMonthSatisfaction")
    public ResponseMessage2  getMonthSatisfaction(){

        return ResponseMessage2.Success2(statisticsService.getSatisfaction(DateUtil.format(new Date(), "yyyy-MM")));
    }


    @ApiOperation(value = "上月满意度")
    @GetMapping(value = "/getLastMonthSatisfaction")
    public ResponseMessage2  getLastMonthSatisfaction(){

        return ResponseMessage2.Success2(statisticsService.getSatisfaction(DateUtil.format(DateUtil.lastMonth(), "yyyy-MM")));
    }
}