package util;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author bin.zhao
 * @description 读取文件中的字段, 生成符合我们使用的对应的实体类,命名规则小驼峰式(nameCode),生成加下划线的@JSONField(name = "name_code"),其他不变
 *              注意data.txt文件的第一行是要生成的class文件的名字,剩下的是文件的字段,目前只支持String类型,后续扩展各种类型
 *              目前默认读取工程目录下的data.txt文件,可根据需要改变读取路径
 *              生成的java文件也在工程目录下,可以根据需要调整
 * @date 2020/4/24
 */
public class JavaToPoJo {

    private static List<String> attres = new ArrayList<>();
    private static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        //获取字段构成的列表
        getAttrs();
        //创建文件;
        createFile();
        //生成文件
        writerFile();
        System.out.println(attres);
    }

    private static void writerFile() throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(attres.get(0)+".java"));
        bw.write(sb.toString(),0,sb.length());
        bw.flush();
        bw.close();
    }

    //创建java实体类
    private static void createFile() {
        //生成头部
        sb.append("import com.alibaba.fastjson.annotation.JSONField;\r\nimport java.io.Serializable;\r\n\r\npublic class "+ attres.get(0) + " implements Serializable{\r\n");
        sb.append("\tprivate static final long serialVersionUID = 1L;\r\n\r\n");
        //生成所有的属性
        createAttributes();
        //生成所有的get/set方法
        createMethods();
        //结尾
        sb.append("}");
    }

    //创建set/get方法
    private static void createMethods() {
        for (int i = 1; i < attres.size(); i++) {
            sb.append("\tpublic String get"+toUpFirstLetter(attres.get(i))+"(){\r\n");
            sb.append("\t\treturn "+attres.get(i)+";\r\n\t}\r\n\r\n");
            sb.append("\tpublic void set"+toUpFirstLetter(attres.get(i))+"(String "+attres.get(i)+"){\r\n");
            sb.append("\t\tthis."+attres.get(i)+" = "+attres.get(i)+";\r\n\t}\r\n\r\n");
        }
    }

    //首字母大写
    private static String toUpFirstLetter(String s) {
        char[] chars = s.toCharArray();
        if (chars[0] >= 'a' && chars[0] <= 'z'){
            chars[0] = (char)(chars[0]-32);
        }
        return new String(chars);
    }

    //创建所有的属性
    private static void createAttributes() {
        for (int i = 1; i < attres.size(); i++) {
            sb.append("\t@JSONField(name = \""+subAttribute(attres.get(i))+"\")\r\n");
            sb.append("\tprivate String "+ attres.get(i) + ";\r\n\r\n");
        }
    }

    //根据大写首字母对字段进行分割并加下划线处理
    private static String subAttribute(String name){
        //创建一个匹配模式
        Pattern p = Pattern.compile("[A-Z]");
        //创建使用指定的正则模式的匹配器
        Matcher m = p.matcher(name);
        while(m.find()){//如果匹配上了返回true
            //根据匹配上的字符进行替换,加上_并转换为小写
            name = name.replaceFirst(m.group(),"_"+m.group().toLowerCase());
        }
        return name;
    }

    //按行读取文件内容,组成一个字段list
    private static void getAttrs() throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
        String s = "";
        while(true){
            s = reader.readLine();
            if (s==null) break;
            attres.add(s);
        }
        reader.close();
    }
}