package com.example.civilizedcity.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.civilizedcity.common.*;

import java.time.LocalDateTime;
import java.util.List;

import com.example.civilizedcity.entity.SysUser;
import com.example.civilizedcity.entity.TaIssue;
import com.example.civilizedcity.event.MessagEvent;
import com.example.civilizedcity.service.TaIssueService;
import com.example.civilizedcity.service.TaOrgIssueService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*;
import com.example.civilizedcity.entity.TaIssueProcess;
import com.example.civilizedcity.service.TaIssueProcessService;

/**
 * 问题处理;(ta_issue_process)表控制层
 *
 * @author : http://njyunzhi.com
 * @date : 2022-12-12
 */
@Api(tags = "问题处理对象功能接口")
@RestController
@RequestMapping("/")
public class TaIssueProcessController extends BaseController {

    @Autowired
    private TaIssueProcessService taIssueProcessService;

    @Autowired
    private TaIssueService taIssueService;

    @Autowired
    private TaOrgIssueService taOrgIssueService;

    @Autowired
    ApplicationEventPublisher applicationEventPublisher;

    /**
     * 通过ID查询单条数据
     *
     * @param processId 主键
     * @return 实例对象
     */
    @ApiOperation("通过ID查询单条数据")
    @GetMapping("/taIssueProcess/{id}")
    public ResponseBean queryById(@ApiParam("对象ID") @PathVariable Integer id) throws Exception {
        return ResponseBean.success(taIssueProcessService.getById(id));
    }

    /**
     * 分页查询
     *
     * @param pageNum  当前页码
     * @param pageSize 每页条数
     * @return 查询结果
     */
    @ApiOperation("分页查询")
    @GetMapping("/taIssueProcess")
    public ResponseBean list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                             @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
                             @ApiParam("问题单ID") @RequestParam(value = "issueId") Integer issueId) throws Exception {

        IPage<TaIssueProcess> pg = new Page<>(pageNum, pageSize);
        QueryWrapper<TaIssueProcess> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("issue_id", issueId);
        queryWrapper.gt("status", Constants.STATUS_DELETE);
        queryWrapper.orderByDesc("create_date");
        IPage<TaIssueProcess> result = taIssueProcessService.page(pg, queryWrapper);

        return ResponseBean.success(result);
    }

    private TaIssue checkIssue(TaIssueProcess taIssueProcess) throws Exception {
        if (null == taIssueProcess.getIssueId()) {
            throw new Exception("找不到对应问题");
        }

        TaIssue taIssue = taIssueService.getById(taIssueProcess.getIssueId());
        if (null == taIssue || taIssue.getStatus() == Constants.STATUS_DELETE) {
            throw new Exception("找不到对应问题");
        }

        if (Constants.PROCESS_END.equals(taIssue.getProcessNode())) {
            throw new Exception("当前问题已办结");
        }

        return taIssue;
    }

    private void updateUser(TaIssueProcess taIssueProcess, SysUser sysUser) {
        taIssueProcess.setOrgId(sysUser.getOrgId());
        taIssueProcess.setCreateUser(sysUser.getUserId());
        taIssueProcess.setUserName(sysUser.getName());
        taIssueProcess.setStatus(Constants.STATUS_NORMAL);
        taIssueProcess.setCreateDate(LocalDateTime.now());
    }

    private void updateIssue(TaIssue taIssue, TaIssueProcess taIssueProcess) {
        taIssue.setProcessNode(taIssueProcess.getProcessNode());
        taIssue.setProcessStatus(taIssueProcess.getProcessStatus());
        taIssueService.updateById(taIssue);
    }

//    /**
//     * 审核
//     *
//     * @param taIssueProcess 实例对象
//     * @return 实例对象
//     */
//    @SaCheckPermission("manager")
//    @ApiOperation("审核")
//    @PostMapping("/taIssueProcess/verify")
//    public ResponseBean verify(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
//        TaIssue taIssue = checkIssue(taIssueProcess);
//
//        if (StringUtils.isEmpty(taIssueProcess.getProcessStatus())) {
//            return ResponseBean.error("请设置审批是否通过");
//        }
//
//        if (Constants.PROCESS_STATUS_REJECT.equals(taIssueProcess.getProcessStatus())) {
//            // 审核未通过
//            if (StringUtils.isEmpty(taIssueProcess.getProcessResult())) {
//                return ResponseBean.error("请填写未通过原因");
//            }
//        }
//
//        updateUser(taIssueProcess, currentUser());
//        taIssueProcess.setProcessNode(Constants.PROCESS_VERIFY);
//        taIssueProcessService.save(taIssueProcess);
//
//        updateIssue(taIssue, taIssueProcess);
//
//        return ResponseBean.success(taIssueProcess);
//    }

    /**
     * 交办
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("manager")
    @ApiOperation("交办")
    @PostMapping("/taIssueProcess/assigned")
    public ResponseBean assigned(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        if (StringUtils.isEmpty(taIssueProcess.getOrgId())) {
            return ResponseBean.error("请指定交办单位");
        } else {
            taIssue.setOrgId(taIssueProcess.getOrgId());
        }
        if (StringUtils.isEmpty(taIssueProcess.getExpireDate())) {
            return ResponseBean.error("请设置截止日期");
        } else {
            if (DateUtils.isAfter(taIssueProcess.getExpireDate() + " 23:59:59")) {
                return ResponseBean.error("请设置有效的截止日期");
            }

            taIssue.setExpireDate(taIssueProcess.getExpireDate());
        }

        SysUser sysUser = currentUser();

        updateUser(taIssueProcess, sysUser);
        taIssueProcess.setProcessNode(Constants.PROCESS_ASSIGNED);
        taIssueProcess.setProcessStatus(Constants.PROCESS_STATUS_READY);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        taOrgIssueService.createNewIssue(taIssue, sysUser);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 驳回
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("org_user")
    @ApiOperation("驳回")
    @PostMapping("/taIssueProcess/reject")
    public ResponseBean reject(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        if (StringUtils.isEmpty(taIssueProcess.getProcessResult())) {
            return ResponseBean.error("请填写未驳回原因");
        }

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setProcessNode(Constants.PROCESS_START);
        taIssueProcess.setProcessStatus(Constants.PROCESS_STATUS_REJECT);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        // 发送消息
        applicationEventPublisher.publishEvent(new MessagEvent(this, taIssue));
        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 单位驳回
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("org_user")
    @ApiOperation("单位驳回")
    @PostMapping("/taIssueProcess/org/reject")
    public ResponseBean orgReject(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        TaIssueProcess prevProcess = taIssueProcessService.getById(taIssueProcess.getPrevProcess());
        if (null == prevProcess) {
            return ResponseBean.error("未找到上级流程");
        }

        if (StringUtils.isEmpty(taIssueProcess.getProcessResult())) {
            return ResponseBean.error("请填写未驳回原因");
        }

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setNextOrg(prevProcess.getOrgId());
        taIssueProcess.setProcessNode(Constants.PROCESS_ASSIGNED);
        taIssueProcess.setProcessStatus(Constants.PROCESS_STATUS_REJECT);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 延期申请
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("org_user")
    @ApiOperation("延期申请")
    @PostMapping("/taIssueProcess/org/delay/apply")
    public ResponseBean delayApply(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        if (StringUtils.isEmpty(taIssueProcess.getExpireDate())) {
            return ResponseBean.error("请设置延期日期");
        } else {
            if (DateUtils.isAfter(taIssueProcess.getExpireDate() + " 23:59:59")) {
                return ResponseBean.error("请设置有效的延期日期");
            }
        }

        TaIssueProcess prevProcess = taIssueProcessService.getById(taIssueProcess.getPrevProcess());
        if (null == prevProcess) {
            return ResponseBean.error("未找到上级流程");
        }

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setNextOrg(prevProcess.getOrgId());
        taIssueProcess.setProcessNode(Constants.PROCESS_ORG_DELAY_APPLY);
        taIssueProcess.setProcessStatus(Constants.PROCESS_STATUS_READY);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 延期审核
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("manager")
    @ApiOperation("延期审核")
    @PostMapping("/taIssueProcess/delay/verify")
    public ResponseBean delayVerify(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        TaIssueProcess prevProcess = taIssueProcessService.getById(taIssueProcess.getPrevProcess());
        if (null == prevProcess) {
            return ResponseBean.error("未找到上级流程");
        }

        if (!Constants.PROCESS_ORG_DELAY_APPLY.equals(prevProcess.getProcessNode())) {
            return ResponseBean.error("上级流程验证不正确");
        }

        if (Constants.PROCESS_STATUS_REJECT.equals(taIssueProcess.getProcessStatus())) {
            // 审核未通过
            if (StringUtils.isEmpty(taIssueProcess.getProcessResult())) {
                return ResponseBean.error("请填写未通过原因");
            }
        } else {
            taIssue.setExpireDate(prevProcess.getExpireDate());
        }

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setNextOrg(prevProcess.getOrgId());
        taIssueProcess.setProcessNode(Constants.PROCESS_DELAY_VERIFY);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 单位交办
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("org_user")
    @ApiOperation("单位交办")
    @PostMapping("/taIssueProcess/org/assigned")
    public ResponseBean orgAssigned(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setProcessNode(Constants.PROCESS_ORG_ASSIGNED);
        taIssueProcess.setProcessStatus(Constants.PROCESS_STATUS_READY);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 单位审核
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("org_manager")
    @ApiOperation("单位审核")
    @PostMapping("/taIssueProcess/org/verify")
    public ResponseBean orgVerify(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        if (StringUtils.isEmpty(taIssueProcess.getProcessStatus())) {
            return ResponseBean.error("请设置审批是否通过");
        }

        if (Constants.PROCESS_STATUS_REJECT.equals(taIssueProcess.getProcessStatus())) {
            // 审核未通过
            if (StringUtils.isEmpty(taIssueProcess.getProcessResult())) {
                return ResponseBean.error("请填写未通过原因");
            }
        }

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setProcessNode(Constants.PROCESS_ORG_VERIFY);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 办结申请
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("org_user")
    @ApiOperation("办结申请")
    @PostMapping("/taIssueProcess/org/finish/apply")
    public ResponseBean finishApply(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        updateUser(taIssueProcess, currentUser());
        taIssueProcess.setNextOrg(Constants.ROOT_ORG);
        taIssueProcess.setProcessNode(Constants.PROCESS_ORG_FINISH_APPLY);
        taIssueProcess.setProcessStatus(Constants.PROCESS_STATUS_READY);
        taIssueProcessService.save(taIssueProcess);

        updateIssue(taIssue, taIssueProcess);

        return ResponseBean.success(taIssueProcess);
    }


    /**
     * 办结审核
     *
     * @param taIssueProcess 实例对象
     * @return 实例对象
     */
    @SaCheckPermission("manager")
    @ApiOperation("办结审核")
    @PostMapping("/taIssueProcess/finish/verify")
    public ResponseBean finishVerify(@ApiParam("对象实体") @RequestBody TaIssueProcess taIssueProcess) throws Exception {
        TaIssue taIssue = checkIssue(taIssueProcess);

        TaIssueProcess prevProcess = taIssueProcessService.getById(taIssueProcess.getPrevProcess());
        if (null == prevProcess) {
            return ResponseBean.error("未找到上级流程");
        }

        if (!Constants.PROCESS_ORG_FINISH_APPLY.equals(prevProcess.getProcessNode())) {
            return ResponseBean.error("上级流程验证不正确");
        }

        if (StringUtils.isEmpty(taIssueProcess.getProcessStatus())) {
            return ResponseBean.error("请设置审批是否通过");
        }

        if (Constants.PROCESS_STATUS_REJECT.equals(taIssueProcess.getProcessStatus())) {
            // 审核未通过
            if (StringUtils.isEmpty(taIssueProcess.getProcessResult())) {
                return ResponseBean.error("请填写未通过原因");
            }
            taIssueProcess.setNextOrg(prevProcess.getOrgId());
            taIssueProcess.setProcessNode(Constants.PROCESS_FINISH_VERIFY);
        } else {
            // 审核通过, 说明整个流程结束
            taIssue.setProcessNode(Constants.PROCESS_END);
            taIssue.setProcessStatus(Constants.PROCESS_STATUS_PASS);
        }

        updateUser(taIssueProcess, currentUser());
        taIssueProcessService.save(taIssueProcess);

        taIssue.setOrgId(taIssueProcess.getOrgId());
        taIssueService.updateById(taIssue);

        return ResponseBean.success(taIssueProcess);
    }

    /**
     * 通过主键删除数据
     *
     * @param processId 主键
     * @return 是否成功
     */
    @ApiOperation("通过主键删除数据")
    @DeleteMapping("/taIssueProcess/{id}")
    public ResponseBean deleteById(@ApiParam("对象ID") @PathVariable Integer id) {
        taIssueProcessService.removeLogicById(id);
        return ResponseBean.success("success");
    }
}