package com.casic.missiles.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.casic.missiles.core.base.controller.BaseController;
import com.casic.missiles.core.base.controller.ExportController;
import com.casic.missiles.core.page.PageFactory;
import com.casic.missiles.core.page.PageInfoBT;
import com.casic.missiles.dto.BaseQueryForm;
import com.casic.missiles.dto.ReturnDTO;
import com.casic.missiles.dto.ReturnUtil;
import com.casic.missiles.dto.flowable.ApprovalRevokeRequest;
import com.casic.missiles.dto.flowable.ApprovalSubmitRequest;
import com.casic.missiles.dto.flowable.BaseApprovalRequest;
import com.casic.missiles.dto.plan.PlanForm;
import com.casic.missiles.dto.plan.PlanQueryForm;
import com.casic.missiles.model.CommonApproval;
import com.casic.missiles.model.equipment.EquipmentInfoApproval;
import com.casic.missiles.model.plan.Plan;
import com.casic.missiles.service.ICommonApprovalService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.util.List;


public class CommonApprovalController<T extends CommonApproval,Q extends BaseQueryForm> extends ExportController {

    private ICommonApprovalService<T,Q> service;

    public CommonApprovalController(ICommonApprovalService<T, Q> service) {
        this.service = service;
    }

    @ApiOperation("删除审批")
    @PostMapping("/approval/delete")
    @ResponseBody
    public ReturnDTO deleteApproval(Long id) {
        service.removeApproval(id);
        return ReturnUtil.success();
    }

    @ApiOperation("提交审批")
    @PostMapping("/approval/submit")
    @ResponseBody
    public ReturnDTO submitApproval(@RequestBody ApprovalSubmitRequest submitRequest) {
        return service.submitApproval(submitRequest);
    }

    @ApiOperation("取消审批")
    @PostMapping("/approval/cancel")
    @ResponseBody
    public ReturnDTO cancelApproval(@RequestBody ApprovalRevokeRequest revokeRequest) {
        return service.cancelApproval(revokeRequest);
    }

    @ApiOperation("同意审批")
    @PostMapping("/approval/agree")
    @ResponseBody
    public ReturnDTO agreeApproval(@RequestBody BaseApprovalRequest agreeRequest) {
        return service.agreeApproval(agreeRequest);
    }

    @ApiOperation("拒绝审批")
    @PostMapping("/approval/refuse")
    @ResponseBody
    public ReturnDTO refuseApproval(@RequestBody BaseApprovalRequest refuseRequest) {
        return service.refuseApproval(refuseRequest);
    }


    @ApiOperation("审批列表-审批/草稿箱/审批中/已通过/未通过/已取消")
    @PostMapping("/approval/listPage")
    @ResponseBody
    public ReturnDTO<PageInfoBT<T>> listPage(@RequestBody Q queryForm) {
        Page<T> page = PageFactory.defaultPage();
        page = service.listPage(page, queryForm);
        return ReturnUtil.success(super.packForBT(page));
    }

    @ApiOperation("审批列表-待审批")
    @PostMapping("/approval/toApprovalListPage")
    @ResponseBody
    public ReturnDTO<PageInfoBT<T>> toApprovalListPage(@RequestBody Q queryForm) {
        Page<T> page = PageFactory.defaultPage();
        page = service.toApprovalListPage(page, queryForm);
        return ReturnUtil.success(super.packForBT(page));
    }


    @ApiOperation("审批列表-已审批")
    @PostMapping("/approval/approvedListPage")
    @ResponseBody
    public ReturnDTO<PageInfoBT<T>> approvedListPage(@RequestBody Q queryForm) {
        Page<T> page = PageFactory.defaultPage();
        page = service.approvedListPage(page, queryForm);
        return ReturnUtil.success(super.packForBT(page));
    }


    @ApiOperation("全部列表")
    @PostMapping("/allPage")
    @ResponseBody
    public ReturnDTO<PageInfoBT<T>> allPage(@RequestBody Q queryForm) {
        Page<T> page = PageFactory.defaultPage();
        page = service.allPage(page, queryForm);
        return ReturnUtil.success(super.packForBT(page));
    }

    @ApiOperation("全部列表导出")
    @PostMapping("/allExport")
    @ResponseBody
    public void allExport(@RequestBody Q queryForm) throws IOException {
        List<T> list = service.allExport(queryForm);
        Class<T> entityClass = (Class<T>) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        super.exportExcel(entityClass,list,"");
    }
}
