package com.highdatas.mdm.util;

import com.highdatas.mdm.process.canvas.ProcessDiagramGenerator;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class WorkflowUtils {


    public static void main(String[] args) {
        System.out.println(toFirstChar("汉字转换为拼音").toUpperCase()); //转为首字母大写
        //System.out.println(toPinyin("汉字转换为拼音"));
    }
    private static Logger logger = LoggerFactory.getLogger(WorkflowUtils.class);

    /**
     * 转换流程节点类型为中文说明
     *
     * @param type 英文名称
     * @return 翻译后的中文名称
     */
    public static String parseToZhType(String type) {
        Map<String, String> types = new HashMap<String, String>();
        types.put("userTask", "用户任务");
        types.put("serviceTask", "系统任务");
        types.put("startEvent", "开始节点");
        types.put("endEvent", "结束节点");
        types.put("exclusiveGateway", "条件判断节点(系统自动根据条件处理)");
        types.put("inclusiveGateway", "并行处理任务");
        types.put("callActivity", "子流程");
        return types.get(type) == null ? type : types.get(type);
    }

    /**
     * 导出图片文件到硬盘
     *
     * @return 文件的全路径
     */
    public static String exportDiagramToFile(RepositoryService repositoryService, ProcessDefinition processDefinition, String exportDir) throws IOException {
//        String diagramResourceName = processDefinition.getDiagramResourceName();
//        String key = processDefinition.getKey();
//        int version = processDefinition.getVersion();
        String diagramPath = exportDir;
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
        ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        ProcessDiagramGenerator diagramGenerator = new ProcessDiagramGenerator();
        InputStream resourceAsStream = diagramGenerator.generateDiagram(bpmnModel, "png",  "WenQuanYi Micro Hei", "WenQuanYi Micro Hei",null, null,0);
        byte[] b = new byte[resourceAsStream.available()];
        
        resourceAsStream.read(b, 0, b.length);

        // create file if not exist
//        String diagramDir = exportDir + "/" + key + "/" + version;
//        File diagramDirFile = new File(diagramDir);
//        if (!diagramDirFile.exists()) {
//            diagramDirFile.mkdirs();
//        }
//        diagramPath = exportDir + "/" +11 +".png";
        File file = new File(diagramPath);

        if (file.exists()) {

        	logger.debug("diagram exist, ignore... : {}", diagramPath);
            return diagramPath;
        } else {
        	File parentFile = file.getParentFile();
        	if (!parentFile.exists()) {
        		parentFile.createNewFile();
			}
            file.createNewFile();
        }

        logger.debug("export diagram to : {}", diagramPath);

        // wirte bytes to file
        FileUtils.writeByteArrayToFile(file, b);
        return diagramPath;
    }


    /**
     * 获取字符串拼音的第一个字母
     * @param chinese
     * @return
     */
    public static String toFirstChar(String chinese){
        String pinyinStr = "";
        char[] newChar = chinese.toCharArray();  //转为单个字符
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < newChar.length; i++) {
            if (newChar[i] > 128) {
                try {
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            }else{
                pinyinStr += newChar[i];
            }
        }
        return pinyinStr;
    }

    /**
     * 汉字转为拼音
     * @param chinese
     * @return
     */
    public static String toPinyin(String chinese){
        String pinyinStr = "";
        char[] newChar = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < newChar.length; i++) {
            if (newChar[i] > 128) {
                try {
                    pinyinStr += PinyinHelper.toHanyuPinyinStringArray(newChar[i], defaultFormat)[0];
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                }
            }else{
                pinyinStr += newChar[i];
            }
        }
        return pinyinStr;
    }
}