package com.artfess.rescue.event.controller;

import com.alibaba.fastjson.JSONObject;
import com.artfess.base.annotation.ApiGroup;
import com.artfess.base.constants.ApiGroupConsts;
import com.artfess.base.enums.ResponseErrorEnums;
import com.artfess.base.model.CommonResult;
import com.artfess.base.query.PageList;
import com.artfess.base.query.QueryFilter;
import com.artfess.base.query.QueryOP;
import com.artfess.base.util.JsonUtil;
import com.artfess.base.valid.AddGroup;
import com.artfess.base.valid.UpdateGroup;
import com.artfess.poi.util.ExcelUtil;
import com.artfess.rescue.event.vo.CountRescueByUserVO;
import com.artfess.rescue.event.vo.CountRescueByRoadVO;
import com.artfess.rescue.event.vo.RescueLedgerVO;
import com.artfess.rescue.monitor.aop.WebSocketNotify;
import com.artfess.rescue.monitor.eunms.RefreshType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.artfess.base.controller.BaseController;
import com.artfess.rescue.event.model.BizRescueInfo;
import com.artfess.rescue.event.manager.BizRescueInfoManager;

import javax.servlet.http.HttpServletResponse;
import java.util.*;

/**
 * 救援信息 前端控制器
 *
 * @company 阿特菲斯信息技术有限公司
 * @author 系统管理员
 * @since 2024-10-22
 */
@RestController
@RequestMapping("/event/bizRescueInfo/v1/")
@Api(tags = "救援信息单")
@ApiGroup(group = {ApiGroupConsts.GROUP_BIZ_RESCUE})
public class BizRescueInfoController extends BaseController<BizRescueInfoManager, BizRescueInfo> {

    @Override
    @PostMapping("/")
    @ApiOperation("添加实体的接口")
    @WebSocketNotify(topic = RefreshType.DLYXJC, operateType = "ADD")
    public CommonResult<String> create(@ApiParam(name = "model", value = "实体信息") @Validated({AddGroup.class}) @RequestBody BizRescueInfo t) {
        boolean res = baseService.saveInfo(t);
        return new CommonResult<>(res?"添加成功":"添加失败");
    }

    @DeleteMapping("/")
    @ApiOperation("根据id集合批量删除")
    @WebSocketNotify(topic = RefreshType.DLYXJC, operateType = "DELETE")
    public CommonResult<String> deleteByIds(@ApiParam(name = "ids", value = "实体集合") @RequestParam String... ids) {
        boolean result = baseService.removeByIds(Arrays.asList(ids));
        if (!result) {
            return new CommonResult<>(ResponseErrorEnums.FAIL_OPTION, "删除实体失败");
        }
        return new CommonResult<>();
    }

    @Override
    @PutMapping("/")
    @ApiOperation("更新实体")
    @WebSocketNotify(topic = RefreshType.DLYXJC, operateType = "UPDATE")
    public CommonResult<String> updateById(@ApiParam(name = "model", value = "实体信息") @Validated({UpdateGroup.class}) @RequestBody BizRescueInfo t) {
        boolean res = baseService.updateInfo(t);
        if (!res) {
            return new CommonResult<>(ResponseErrorEnums.FAIL_OPTION, "更新实体失败");
        }
        return new CommonResult<>("更新实体成功");
    }

    @RequestMapping(value = "/appoint", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "救援委派", httpMethod = "POST", notes = "救援委派")
    @WebSocketNotify(topic = RefreshType.DLYXJC, operateType = "ADD")
    public CommonResult<String> appoint(@RequestBody BizRescueInfo entity) {
        boolean res = baseService.appoint(entity);
        return new CommonResult<>(res,res?"委派成功":"委派失败");
    }

    @RequestMapping(value = "/cancel", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "事件撤销", httpMethod = "POST", notes = "事件撤销")
    public CommonResult<String> cancel(@RequestParam("id") String id) {
        boolean res = baseService.cancel(id);
        return new CommonResult<>(res,res?"撤销成功":"撤销失败");
    }

    @Override
    @GetMapping("/{id}")
    @ApiOperation("根据id查询实体")
    public BizRescueInfo getById(@ApiParam(name = "id", value = "实体id") @PathVariable String id) {
        return baseService.getDetailById(id);
    }

    @RequestMapping(value = "/event/{eventId}", method = RequestMethod.GET, produces = {"application/json; charset=utf-8"})
    @ApiOperation("根据事件id查询事件")
    public List<BizRescueInfo> getByEventId(@ApiParam(name = "eventId", value = "事件id") @PathVariable String eventId){
        return baseService.getDetailByEventId(eventId);
    }

    @Override
    @RequestMapping(value = "/query", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "分页查询", httpMethod = "POST", notes = "分页查询")
    public PageList<BizRescueInfo> query(@RequestBody QueryFilter<BizRescueInfo> queryFilter) {
        queryFilter.addFilter("IS_DELE_","0",QueryOP.EQUAL);
        return baseService.query(queryFilter);
    }


    @RequestMapping(value = "/queryByPower", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "带权限分页查询", httpMethod = "POST", notes = "带权限分页查询")
    public PageList<BizRescueInfo> queryByPower(@RequestBody QueryFilter<BizRescueInfo> queryFilter) {
        return baseService.queryByPower(queryFilter);
    }

    @RequestMapping(value = "/queryByAppraise", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "救援回访查询", httpMethod = "POST", notes = "救援回访查询")
    public PageList<BizRescueInfo> queryByAppraise(@RequestBody QueryFilter<BizRescueInfo> queryFilter) {
        return baseService.queryByAppraise(queryFilter);
    }

    @RequestMapping(value = "/count/user", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "救援统计-拖车人员汇总统计", httpMethod = "POST", notes = "拖车人员汇总统计")
    public CommonResult<List<CountRescueByUserVO>> countByUser(@RequestBody QueryFilter<BizRescueInfo> queryFilter) {
        return baseService.countByUser(queryFilter);
    }

    @RequestMapping(value = "/count/road", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
    @ApiOperation(value = "救援统计-拖车部门汇总统计", httpMethod = "POST", notes = "拖车部门汇总统计")
    public CommonResult<JSONObject> countByRoad(@RequestBody QueryFilter<BizRescueInfo> queryFilter) {
        return baseService.countByRoad(queryFilter);
    }


    @PostMapping(value = "/export/road")
    @ApiOperation(value = "excel导出-拖车部门汇总统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public void exportByContent(HttpServletResponse response, @RequestBody QueryFilter<BizRescueInfo> queryFilter) throws Exception {
        CommonResult<JSONObject> result = baseService.countByRoad(queryFilter);
        JSONObject object= result.getValue();
        List<CountRescueByRoadVO> voList = (List<CountRescueByRoadVO>) object.get("data");
        List<Map<String, Object>> list = new ArrayList<>();
        if (voList != null && voList.size() > 0) {
            int i = 1;
            for (CountRescueByRoadVO vo : voList) {
                String jsonStr = JsonUtil.toJson(vo);
                Map<String, Object> map = JsonUtil.toMap(jsonStr);
                //序号
                map.put("sn", i);
                i++;
                list.add(map);
            }
        }
        String tempName = "拖车路段汇总统计";
        Map<String, String> exportMaps = new LinkedHashMap<>();
        exportMaps.put("sn", "序号");
        exportMaps.put("roadName", "路段名称");
        exportMaps.put("reachSum", "30分钟到达次数(次)");
        exportMaps.put("trailersMileage", "拖车里程(km)");
        exportMaps.put("averageResponseTime", "平均响应时间(分)");
        exportMaps.put("averageAttendanceTime", "平均出勤时间(分)");
        exportMaps.put("averageReachTime", "平均到达时间(分)");
        exportMaps.put("averageWorkTime", "平均作业时间(分)");
        exportMaps.put("averageHandlingTime", "平均处置时间(分)");
        exportMaps.put("trailersAmount", "拖车总金额(元)");
        HSSFWorkbook book = ExcelUtil.exportExcel(tempName, 24, exportMaps, list);
        ExcelUtil.downloadExcel(book, tempName, response);
    }

    @PostMapping("/ledger/export")
    @ApiOperation(value = "台账导出", httpMethod = "POST", notes = "台账导出")
    public ResponseEntity<?> exportToBrowser(@RequestBody QueryFilter<BizRescueInfo> queryFilter){
        return baseService.exportLedger(queryFilter);
    }

    @PostMapping("/ledger")
    @ApiOperation(value = "台账详情", httpMethod = "POST", notes = "台账详情")
    public RescueLedgerVO getEventTaskLedger(@RequestBody QueryFilter<BizRescueInfo> queryFilter){
        return baseService.getTaskLedger(queryFilter);
    }


    @PostMapping("/ledger/excelExport")
    @ApiOperation(value = "台账详情", httpMethod = "POST", notes = "台账详情导出")
    public void getEventTaskLedger(HttpServletResponse response,@RequestBody QueryFilter<BizRescueInfo> queryFilter){
        baseService.ledgerExport(response,queryFilter);
    }

}

