package pwc.taxtech.atms.controller;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.ProcessDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import pwc.taxtech.atms.common.util.MyAsserts;
import pwc.taxtech.atms.dto.approval.ApprovalDto;
import pwc.taxtech.atms.dto.approval.ApprovalTask;
import pwc.taxtech.atms.exception.Exceptions;
import pwc.taxtech.atms.vat.dpo.ApprovalTaskInfo;
import pwc.taxtech.atms.vat.service.impl.ApprovalService;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;

@RestController
@RequestMapping(value = "/api/v1/approval")
public class ApprovalController {
    private static Logger logger = LoggerFactory.getLogger(ApprovalController.class);
    @Autowired
    RuntimeService runtimeService;
    @Autowired
    TaskService taskService;
    @Autowired
    ApprovalService approvalService;
    @Autowired
    RepositoryService repositoryService;


    @ResponseBody
    @RequestMapping(value = "/deploy", method = RequestMethod.POST)
    public ResponseEntity deploy() {
        repositoryService.createDeployment().addClasspathResource("bpmn/approval.bpmn").deploy();
        return ResponseEntity.ok().build();
    }

    @ResponseBody
    @RequestMapping(value = "/commit", method = RequestMethod.POST)
    public ApprovalDto approval(@RequestBody ApprovalDto dto) {
        MyAsserts.assertNotEmpty(dto.getProjectId(), Exceptions.EMPTY_PROJECT_PARAM);
        MyAsserts.assertNotEmpty(dto.getPeriodDate(), Exceptions.EMPTY_PRIODDATE_PARAM);
        approvalService.startInstanceAndAssignee(dto);
        return dto;
    }

    @ResponseBody
    @RequestMapping(value = "/tasks/{assignee}")
    public List<ApprovalTaskInfo> data(@PathVariable String assignee) {//accountant manager
        return approvalService.getTask();
    }

    @ResponseBody
    @RequestMapping(value = "/check/{taskId}")
    public void check(@PathVariable String taskId, @RequestParam String decide) {//only for manager role
        approvalService.checkTask(taskId, decide);
    }

    @RequestMapping(value = "/show/{procDefId}")//获取流程图
    public void showImg(@PathVariable String procDefId, HttpServletResponse response) {
        try {
            ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId).singleResult();
            String diagramResourceName = pd.getDiagramResourceName();
            InputStream pic = repositoryService.getResourceAsStream(pd.getDeploymentId(), diagramResourceName);

            byte[] b = new byte[1024];
            int len = -1;
            while ((len = pic.read(b, 0, 1024)) != -1) {
                response.getOutputStream().write(b, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @ResponseBody
    @RequestMapping(value = "/showImg/{procDefId}/{executionId}")//获取流程坐标
    public Rect showImg(@PathVariable String procDefId, @PathVariable String executionId) {
        Rect rect = new Rect();
        try {
            repositoryService.getProcessDefinition(procDefId);
//            ActivityImpl img = Workflow.getProcessMap(procDefId,executionId );
//            rect.setX(img.getX());
//            rect.setY(img.getY());
//            rect.setWidth(img.getWidth());
//            rect.setHeight(img.getHeight());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rect;
    }


    static class Rect {
        String X;
        String Y;
        String width;
        String height;

        public String getX() {
            return X;
        }

        public void setX(String x) {
            X = x;
        }

        public String getY() {
            return Y;
        }

        public void setY(String y) {
            Y = y;
        }

        public String getWidth() {
            return width;
        }

        public void setWidth(String width) {
            this.width = width;
        }

        public String getHeight() {
            return height;
        }

        public void setHeight(String height) {
            this.height = height;
        }
    }


    private void mocoDisAggreAndOver() {
        logger.debug("------------------------update db -----------------------------------");
        logger.debug("dis aggre");
        logger.debug("------------------------updage db-----------------------------------");
    }

    private void mocoAggreAndOver() {
        logger.debug("------------------------update db-----------------------------------");
        logger.debug("aggree");
        logger.debug("------------------------update db-----------------------------------");
    }

    private void mocoHasCommittedAndOver() {
        logger.debug("-------------------------update db----------------------------------");
        logger.debug("has committed");
        logger.debug("-------------------------update db----------------------------------");
    }


    private void mocoInsert(ApprovalDto dto) {
        logger.debug("-------------------------insert db----------------------------------");
        logger.debug("save approval {}", dto.toString());
        logger.debug("-------------------------insert db----------------------------------");
    }

}