package com.steerinfo.meterwork.meterworkmonitor.controller;

import com.steerinfo.framework.controller.BaseRESTfulController;
import com.steerinfo.framework.controller.RESTfulResult;
import com.steerinfo.framework.service.pagehelper.PageList;
import com.steerinfo.framework.utils.collection.ListUtils;
import com.steerinfo.meterwork.except.MarkerMetException;
import com.steerinfo.meterwork.meterworkmonitor.dto.MeterWorkMonitorDto;
import com.steerinfo.meterwork.meterworkmonitor.model.MeterWorkMonitor;
import com.steerinfo.meterwork.meterworkmonitor.service.IMeterWorkMonitorService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * MeterWorkMonitor RESTful接口：
 *
 * @author generator
 * @version 1.0-SNAPSHORT 2020-11-06 03:27
 * 类描述
 * 修订历史：
 * 日期：2020-11-06
 * 作者：generator
 * 参考：
 * 描述：MeterWorkMonitor RESTful接口
 * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 * @see null
 */
@RestController
@RequestMapping("/${api.version}/meterworkmonitors")
public class MeterWorkMonitorController extends BaseRESTfulController {

    private static final Logger log = LoggerFactory.getLogger(MeterWorkMonitorController.class);

    @Value("${rtdb.monitor.sync.pointNo}")
    private List<String> rtdbPointNo;

    @Autowired
    IMeterWorkMonitorService meterWorkMonitorService;

    @ApiOperation(value = "获取列表", notes = "分页查询")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageNum", value = "查询页数", required = false, dataType = "Integer"),
            @ApiImplicitParam(name = "pageSize", value = "每页记录数", required = false, dataType = "Integer")
    })
    //@RequiresPermissions("meterworkmonitor:view")
    @GetMapping(value = "/")
    public RESTfulResult list(@RequestParam HashMap parmas, Integer pageNum, Integer pageSize) {
        try {
            PageList<MeterWorkMonitorDto> list = meterWorkMonitorService.queryForPage2(parmas, pageNum, pageSize);
            return success(list);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "电子地图获取除去陇西所有的秤点信息-获取列表", notes = "分页查询")
    //@RequiresPermissions("meterworkmonitor:view")
    @GetMapping(value = "/listByLonxi/")
    public RESTfulResult listByLonxi(@RequestParam HashMap parmas, Integer pageNum, Integer pageSize) {
        try {
            PageList<MeterWorkMonitorDto> list = meterWorkMonitorService.listByLonxi(parmas, pageNum, pageSize);
            return success(list);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "获取列表", notes = "分页模糊查询")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageNum", value = "查询页数", required = false, dataType = "Integer"),
            @ApiImplicitParam(name = "pageSize", value = "每页记录数", required = false, dataType = "Integer")
    })
    //@RequiresPermissions("meterworkmonitor:view")
    @GetMapping(value = "/like/")
    public RESTfulResult listLike(@RequestParam HashMap parmas, Integer pageNum, Integer pageSize) {
        try {
            PageList<MeterWorkMonitor> list = meterWorkMonitorService.queryLikeForPage(parmas, pageNum, pageSize);
            return success(list);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "创建", notes = "根据MeterWorkMonitor对象创建")
    @ApiImplicitParam(name = "meterWorkMonitor", value = "详细实体meterWorkMonitor", required = true, dataType = "MeterWorkMonitor")
    //@RequiresPermissions("meterworkmonitor:create")
    @PostMapping(value = "/")
    public RESTfulResult add(@ModelAttribute MeterWorkMonitor model) {
        try {
            MeterWorkMonitor meterWorkMonitor = meterWorkMonitorService.add(model);
            return success(meterWorkMonitor);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
    @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String")
    //@RequiresPermissions("meterworkmonitor:view")
    @GetMapping(value = "/{id}")
    public RESTfulResult get(@PathVariable String id) {
        try {
            MeterWorkMonitor meterWorkMonitor = meterWorkMonitorService.getById(id);
            return success(meterWorkMonitor);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "更新详细信息", notes = "根据url的id来指定更新对象，并根据传过来的meterWorkMonitor信息来更新详细信息")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String"),
            @ApiImplicitParam(name = "meterWorkMonitor", value = "详细实体meterWorkMonitor", required = true, dataType = "MeterWorkMonitor")
    })
    //@RequiresPermissions("meterworkmonitor:update")
    @PutMapping(value = "/{id}", produces = "application/json;charset=UTF-8")
    public RESTfulResult update(@PathVariable String id, @RequestBody MeterWorkMonitor model) {
        try {
            model.setId(id);
            MeterWorkMonitor meterWorkMonitor = meterWorkMonitorService.modify(model);
            return success(meterWorkMonitor);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
    @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String")
    //@RequiresPermissions("meterworkmonitor:delete")
    @DeleteMapping(value = "/{id}")//String
    public RESTfulResult delete(@PathVariable String id) {
        try {
            List<String> list = Arrays.asList(id.split(","));
            if (ListUtils.isNotEmpty(list)) {
                List<String> ids = ListUtils.convertList(list);
                meterWorkMonitorService.delete(ids);
            }
            return success();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "WF获取列表")
    @PostMapping(value = "/doQueryWf", produces = "application/json;charset=UTF-8")
    public RESTfulResult doQueryWf(@RequestBody MeterWorkMonitor oci) {
        try {
            RESTfulResult rm = meterWorkMonitorService.doQueryWf(oci);
            return rm;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "更新详细信息", notes = "根据url的id来指定更新对象，并根据传过来的meterWorkMonitor信息来更新详细信息")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String"),
            @ApiImplicitParam(name = "meterWorkMonitor", value = "详细实体meterWorkMonitor", required = true, dataType = "MeterWorkMonitor")
    })
    //@RequiresPermissions("meterworkmonitor:update")
    @PostMapping(value = "/doUpdateWf", produces = "application/json;charset=UTF-8")
    public RESTfulResult update(@RequestBody MeterWorkMonitor model) {
        long start = System.currentTimeMillis();
        String reqPointNo = model == null ? null : model.getPointNo();
        log.info("[MonitorRTDB] doUpdateWf enter pointNo={}", reqPointNo);
        try {
            String pointNo = meterWorkMonitorService.doUpdateWf(model);
            if (pointNo == null || pointNo.isEmpty()) {
                log.warn("[MonitorRTDB] doUpdateWf fail pointNo={} costMs={}",
                        reqPointNo, System.currentTimeMillis() - start);
                return failed(null, "修改失败");
            }
            log.info("[MonitorRTDB] doUpdateWf ok pointNo={} costMs={}",
                    pointNo, System.currentTimeMillis() - start);
            return success(pointNo);
        } catch (Exception ex) {
            log.error("[MonitorRTDB] doUpdateWf exception pointNo={} costMs={}",
                    reqPointNo, System.currentTimeMillis() - start, ex);
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "更新详细信息", notes = "根据url的id来指定更新对象，并根据传过来的meterWorkMonitor信息来更新详细信息")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String"),
            @ApiImplicitParam(name = "meterWorkMonitor", value = "详细实体meterWorkMonitor", required = true, dataType = "MeterWorkMonitor")
    })
    //@RequiresPermissions("meterworkmonitor:update")
    @PostMapping(value = "/doUpdateWfBySpotNo", produces = "application/json;charset=UTF-8")
    public RESTfulResult updateLastTime(@RequestBody MeterWorkMonitor model) {
        long start = System.currentTimeMillis();
        String reqPointNo = model == null ? null : model.getPointNo();
        return success();
//        log.info("[MonitorRTDB] updateLastTime enter pointNo={}", reqPointNo);
//        try {
//
//            String pointNo = meterWorkMonitorService.doUpdateWf(model);
//            if (pointNo == null || pointNo.isEmpty()) {
//                log.warn("[MonitorRTDB] updateLastTime fail pointNo={} costMs={}",
//                        reqPointNo, System.currentTimeMillis() - start);
//                return failed(null, "修改失败");
//            }
//            log.info("[MonitorRTDB] updateLastTime ok pointNo={} costMs={}",
//                    pointNo, System.currentTimeMillis() - start);
//            return success(pointNo);
//        } catch (Exception ex) {
//            log.error("[MonitorRTDB] updateLastTime exception pointNo={} costMs={}",
//                    reqPointNo, System.currentTimeMillis() - start, ex);
//            throw new MarkerMetException(500, "操作异常！！");
//        }
    }

    @ApiOperation(value = "测试", notes = "根据url的id来获取详细信息")
    @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String")
    //@RequiresPermissions("meterworkmonitor:view")
    @GetMapping(value = "/ceshi")
    public RESTfulResult ceshi() {
        try {
            meterWorkMonitorService.AutomaticAllocation();
            return success();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @ApiOperation(value = "根据车号查询meterWorkMonitor表的重量", notes = "根据车号返回重量")
    //@RequiresPermissions("meterworkmonitor:view")
    @PostMapping(value = "/weightByCarNo")
    public RESTfulResult weightByCarNo(@RequestBody HashMap params) {
        try {
            String rfidCar = params.get("rfidCar") == null ? "": params.get("rfidCar").toString();
            RESTfulResult rm = meterWorkMonitorService.weightByCarNo(rfidCar);
            return rm;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new MarkerMetException(500, "操作异常！！");
        }
    }

    @PostMapping(value = "/testRtdb")
    public void testRtdb() {
        // 获取数据库的数据
        List<MeterWorkMonitor> dbList = meterWorkMonitorService.queryForList();
        meterWorkMonitorService.doUpdateWf(dbList.get(0));
    }
}
