package com.boco.nbd.wios.flow.util;

import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.ApiModelProperty;

import javax.persistence.Column;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author:cao hai
 * @date:2022/6/27 14:01
 * @version:V1.0
 * @description:TODO ClassInitUtil
 * @modify:
 */
public class ClassInitUtil {

    private static final String SPLIT_CHAR = "\\n";

    private static final String SPLIT_FIELD = "\\s+";

    private static final String LINE_CHAR = "_";

    private static final String COMMENT = "COMMENT";

    private static final String VARCHAR_CHAR = "varchar";

    private static final String INT_CHAR = "int";

    private static final String TINYINT_CHAR = "tinyint";

    private static final String LONG_CHAR = "int(11)";

    private static final String DATETIME_CHAR = "datetime";

    /**
     * 下划线正则
     */
    public final static Pattern LINE_PATTERN = Pattern.compile("_(\\w)");

    /**
     * 生成class 内容
     *
     * @param str
     * @return
     */
    public static String createClass(String str) {
        String[] items = str.split(SPLIT_CHAR);
        StringBuffer buffer = new StringBuffer();
        for (String item : items) {
            String fieldDescribe = "";
            String fieldName = "";
            String fieldType = "";
            String[] info = item.trim().split(COMMENT);
            if (info.length >= 2) {
                fieldDescribe = info[info.length - 1].trim().replace("'", "");
                fieldDescribe = fieldDescribe.substring(0, fieldDescribe.length() - 1);
            }
            String[] fieldInfo = info[0].trim().split(SPLIT_FIELD);
            if (fieldInfo.length < 3) {
                continue;
            }
            fieldName = fieldInfo[0].trim().replace("`", "");
            fieldType = fieldInfo[1].trim();
            buffer.append("@Column(name =\"" + fieldName + "\")" + System.lineSeparator());
            buffer.append("@ApiModelProperty(value = \"" + fieldDescribe + "\")" + System.lineSeparator());
            buffer.append("private ");
            buffer.append(getType(fieldType) + " ");
            buffer.append(lineToHump(fieldName) + " ");
            buffer.append(";" + System.lineSeparator());
            buffer.append(System.lineSeparator());
        }

        return buffer.toString();
    }

    /**
     * 获取类型
     *
     * @param type
     * @return
     */
    private static String getType(String type) {
        if (type.startsWith(VARCHAR_CHAR)) {
            return String.class.getSimpleName();
        }
        if (type.startsWith(INT_CHAR) || type.startsWith(TINYINT_CHAR)) {
            return Integer.class.getSimpleName();
        }
        if (type.startsWith(LONG_CHAR)) {
            return Long.class.getSimpleName();
        }
        if (type.startsWith(DATETIME_CHAR)) {
            return Date.class.getSimpleName();
        }
        return "";
    }

    /**
     * 下划线转驼峰
     *
     * @param str
     * @return
     */
    public static String lineToHump(String str) {
        if (StrUtil.isEmpty(str)) {
            return "";
        }
        String regex = "^[A-Z0-9]+$";
        //处理已经是大写格式的时候,正则处理存在问题,只有大写字母、数字组成的不处理
        if (Pattern.matches(regex, str)) {
            return str.toLowerCase(Locale.ROOT);
        }

        //已经是驼峰不处理
        if (str.contains(LINE_CHAR)) {
            str = str.toLowerCase(Locale.ROOT);
            StringBuffer buffer = new StringBuffer();
            Matcher matcher = LINE_PATTERN.matcher(str);
            while (matcher.find()) {
                matcher.appendReplacement(buffer, matcher.group(1).toUpperCase(Locale.ROOT));
            }
            matcher.appendTail(buffer);
            return buffer.toString();
        }

        return str;

    }
}