package cn.wisenergy.chnmuseum.party.web.controller;

import cn.wisenergy.chnmuseum.party.model.DemandInfo;
import cn.wisenergy.chnmuseum.party.model.Employee;
import cn.wisenergy.chnmuseum.party.service.impl.DemandInfoServiceImpl;
import cn.wisenergy.chnmuseum.party.service.impl.EmployeeServiceImpl;
import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vdurmont.emoji.EmojiParser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 需求建议信息 前端控制器
 * </p>
 *
 * @author 杨智平
 * @since 2018-08-29
 */
@Api(tags = "呼叫服务或者吐槽建议")
@RestController
@RequestMapping("/demandInfo")
public class DemandInfoController extends BaseController {

    private static final Logger logger = LoggerFactory.getLogger(EmployeeController.class);

    @Resource
    private DemandInfoServiceImpl demandInfoService;

    @Resource
    private EmployeeServiceImpl employeeService;

    /**
     * 获取单个呼叫服务或者吐槽建议
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "获取单个呼叫服务或者吐槽建议")
    @GetMapping(value = "/getById")
    @RequiresPermissions("/demandInfo/getById")
    public ResponseEntity<DemandInfo> getById(String id) {
        try {
            DemandInfo one = this.demandInfoService.selectOneById(id);
            if (null != one) {
                one.setContent(EmojiParser.parseToUnicode(one.getContent()));
                if (StringUtils.isNotBlank(one.getFeedbackInfo())) {
                    one.setFeedbackInfo(EmojiParser.parseToUnicode(one.getFeedbackInfo()));
                }
                return ResponseEntity.ok(one);
            }
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        } catch (Exception e) {
            logger.error("获取单个呼叫服务或者吐槽建议出错!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }


    /**
     * 获取呼叫服务或者吐槽建议列表
     *
     * @param lineNumber
     * @param content
     * @param phoneNumber
     * @param type
     * @param time
     * @return
     */
    @ApiOperation(value = "获取呼叫服务或者吐槽建议列表")
    @GetMapping(value = "/getList")
    @RequiresPermissions("/demandInfo/getList")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "lineNumber", value = "叫号单号", required = false),
            @ApiImplicitParam(name = "content", value = "需求内容", required = false, dataType = "String"),
            @ApiImplicitParam(name = "phoneNumber", value = "手机号码", required = false, dataType = "String"),
            @ApiImplicitParam(name = "type", value = "消息类型:1-吐槽建议2-呼叫记录", required = true),
            @ApiImplicitParam(name = "time", value = "反馈日期", required = false, dataType = "String"),
            @ApiImplicitParam(name = "callTime", value = "呼叫日期", required = false, dataType = "String"),
            @ApiImplicitParam(name = "bankBranchId", value = "归属网点ID", required = false, dataType = "String")})
    public ResponseEntity<Page<DemandInfo>> getList(String lineNumber, String content, String phoneNumber,
                                                    Integer type, String time, String callTime, String bankBranchId,
                                                    String roleId, String currentBankId) {
        try {
            if (!"3".equals(roleId)) {
                roleId = "0";
            }
            String startDate = null;
            String endDate = null;
            String callStartDate = null;
            String callEndDate = null;
            if (StringUtils.isNoneBlank(time)) {
                startDate = time + " 00:00:00";
                endDate = time + " 23:59:59";
            }
            if (StringUtils.isNoneBlank(callTime)) {
                callStartDate = callTime + " 00:00:00";
                callEndDate = callTime + " 23:59:59";
            }
            lineNumber = StringUtils.trimToNull(lineNumber); // 清除掉str首尾的空白字符,如果仅str全由空白字符组成则返回null
            content = StringUtils.trimToNull(content);
            phoneNumber = StringUtils.trimToNull(phoneNumber);
            Page<DemandInfo> page = this.getPage();
            Page<DemandInfo> demandInfoPage = this.demandInfoService.selectDemandInfoList(page, lineNumber, content, phoneNumber,
                    startDate, endDate, type, bankBranchId, callStartDate, callEndDate, roleId, currentBankId);
            for (DemandInfo demandInfo : demandInfoPage.getRecords()) {
                demandInfo.setContent(EmojiParser.parseToUnicode(demandInfo.getContent()));
                if (StringUtils.isNotBlank(demandInfo.getFeedbackInfo())) {
                    demandInfo.setFeedbackInfo(EmojiParser.parseToUnicode(demandInfo.getFeedbackInfo()));
                }
            }
            return ResponseEntity.ok(demandInfoPage);
        } catch (Exception e) {
            logger.error("服务器错误!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }

    /**
     * 添加
     */
    @Transactional
    @ApiOperation("APP端添加吐槽建议或者呼叫记录")
    @PostMapping(value = "/add")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "lineNumber", value = "叫号单号", required = true),
            @ApiImplicitParam(name = "content", value = "需求内容", required = true, dataType = "String"),
            @ApiImplicitParam(name = "phoneNumber", value = "手机号码", required = true, dataType = "String"),
            @ApiImplicitParam(name = "type", value = "消息类型:1-吐槽建议2-呼叫记录", required = true)})
    public ResponseEntity<Map<String, Object>> add(DemandInfo demandInfo) {
        Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
        try {
            boolean ret = false;
            //接收人员工号,多人使用|分割,如"01014760|01158451"
            String recUsrNbr = "";
            //反馈人ID
            String personId = "";
            if (demandInfo.getBankBranchId() != null) {
                Employee emp = this.employeeService.getEmpCodeBybankId(demandInfo.getBankBranchId());
                if (emp != null) {
                    recUsrNbr = emp.getCode();
                    personId = emp.getId();
                    //现在改为反馈的时候再存入反馈人ID
//                    demandInfo.setFeedbackPersonId(emp.getId());
                }
            }
            demandInfo.setLineNumber(StringUtils.trimToNull(demandInfo.getLineNumber()));// 清除掉str首尾的空白字符,如果仅str全由空白字符组成则返回null
            demandInfo.setContent(EmojiParser.parseToHtmlHexadecimal(demandInfo.getContent().trim()));
            demandInfo.setPhoneNumber(StringUtils.trimToNull(demandInfo.getPhoneNumber()));
            demandInfo.setCreateTime(new Date(System.currentTimeMillis()));
            ret = this.demandInfoService.save(demandInfo);
            if (!ret) {
                resultMap.put("status", 400);
                resultMap.put("message", "提交失败");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }

            if (!"".equals(recUsrNbr)) {
                //招乎正文,要求以[发送人姓名OR发送人部室]正文格式
                String zhCnt = "";
                if (demandInfo.getType() == 1) {
                    //吐槽建议
                    zhCnt = "客户" + demandInfo.getLineNumber() + "号("
                            + demandInfo.getPhoneNumber() + ")有吐槽建议,请及时反馈改进,"
                            + "并点击链接" + demandInfo.getId() + "&personId=" + personId + "及时回复客户。";
                } else if (demandInfo.getType() == 2) {
                    //呼叫大堂
                    zhCnt = "客户" + demandInfo.getLineNumber() + "号("
                            + demandInfo.getPhoneNumber() + ")呼叫大堂,内容为'"
                            + demandInfo.getContent() + "',请及时服务接待!";

                }
                logger.info(zhCnt);
            }
            // 201
            resultMap.put("status", 201);
            resultMap.put("message", "提交成功");
            return ResponseEntity.status(HttpStatus.CREATED).body(resultMap);
        } catch (Exception e) {
            logger.error("提交错误!", e);
        }
        resultMap.put("status", 500);
        resultMap.put("message", "操作失败");
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resultMap);
    }

    @ApiOperation(value = "填写反馈内容")
    @PutMapping(value = "/edit")
    public ResponseEntity<Map<String, Object>> edit(String id, String feedbackInfo, String personId) {
        Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
        try {
            if (!StringUtils.isNoneBlank(id)) {
                resultMap.put("status", 400);
                resultMap.put("message", "页面信息失效,请重新点击链接进入");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }
            //验证反馈人是否存在
            Employee employee = employeeService.getById(personId);
            if (employee == null) {
                resultMap.put("status", 400);
                resultMap.put("message", "反馈链接有误");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }
            if (!StringUtils.isNoneBlank(feedbackInfo)) {
                resultMap.put("status", 400);
                resultMap.put("message", "请输入反馈内容");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            } else {
                feedbackInfo = StringUtils.trimToNull(feedbackInfo); // 清除掉str首尾的空白字符,如果仅str全由空白字符组成则返回null
            }

            DemandInfo entity = this.demandInfoService.getById(id);
            if (entity.getFeedbackInfo() != null) {
                resultMap.put("status", 400);
                resultMap.put("message", "您已反馈,请勿重复提交!");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resultMap);
            }

            //保存反馈人ID
            entity.setFeedbackPersonId(personId);
            entity.setFeedbackTime(new Date(System.currentTimeMillis()));
            entity.setFeedbackInfo(EmojiParser.parseToHtmlHexadecimal(feedbackInfo.trim()));
            boolean ret = this.demandInfoService.updateById(entity);
            if (!ret) {
                resultMap.put("status", 500);
                resultMap.put("message", "反馈失败");
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resultMap);
            } else {
                resultMap.put("status", 201);
                resultMap.put("message", "反馈成功");
                return ResponseEntity.ok(resultMap);
            }
        } catch (Exception e) {
            logger.error("反馈错误!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(resultMap);
    }

    /**
     * App获取呼叫服务或者吐槽建议列表
     *
     * @param type
     * @param advisorId
     * @param bankBranchId
     * @return
     */
    @ApiOperation(value = "App获取呼叫服务或者吐槽建议列表")
    @GetMapping(value = "/getListOnApp")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "type", value = "消息类型:1-吐槽建议2-呼叫记录", required = true),
            @ApiImplicitParam(name = "advisorId", value = "发送人ID(当前登陆用户Id)", required = true, dataType = "String"),
            @ApiImplicitParam(name = "bankBranchId", value = "归属网点ID", required = true, dataType = "String")})
    public ResponseEntity<List<DemandInfo>> getListOnApp(Integer type, String advisorId, String bankBranchId) {
        try {

            QueryWrapper<DemandInfo> demandInfoWrapper = new QueryWrapper<>();
            demandInfoWrapper.eq("type", type)
                    .eq("advisor_id", advisorId)
                    .eq("bank_branch_id", bankBranchId)
                    .orderByDesc("create_time");
            List<DemandInfo> demandInfoList = this.demandInfoService.list(demandInfoWrapper);
            for (DemandInfo demandInfo : demandInfoList) {
                demandInfo.setContent(EmojiParser.parseToUnicode(demandInfo.getContent()));
                if (StringUtils.isNotBlank(demandInfo.getFeedbackInfo())) {
                    demandInfo.setFeedbackInfo(EmojiParser.parseToUnicode(demandInfo.getFeedbackInfo()));
                }
            }
            return ResponseEntity.ok(demandInfoList);
        } catch (Exception e) {
            logger.error("服务器错误!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }

    /**
     * APP获取单个呼叫服务或者吐槽建议
     *
     * @param id
     * @return
     */
    @ApiOperation(value = "App获取单个呼叫服务或者吐槽建议")
    @GetMapping(value = "/getByIdForApp")
    public ResponseEntity<DemandInfo> getByIdForApp(String id) {
        try {
            QueryWrapper<DemandInfo> ew = new QueryWrapper<>();
            ew.select("id,line_number AS lineNumber,create_time AS createTime,phone_number AS phoneNumber,content,feedback_info AS feedbackInfo");
            ew.eq("id", id);
            DemandInfo one = this.demandInfoService.getOne(ew);
            if (null != one) {
                return ResponseEntity.ok(one);
            }
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        } catch (Exception e) {
            logger.error("获取单个呼叫服务或者吐槽建议出错!", e);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
    }



}