package com.ruoyi.web.controller.common;

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 数据库设计文档生成工具类
 * 仅支持mysql数据库
 * 文档更详细
 */
public class DataBaseScrewUtil {

    public static final String driverUrl = "jdbc:mysql://192.168.0.119:3308/jijiu_car_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
    public static final String dataBase = "jijiu_car_system";
    public static final String username = "root";
    public static final String password = "songlanyun";
    public final static String filePath = "d:\\疾控备案";

    public static void main(String[] args)throws Exception {
        System.out.println("开始生成文档~~~");
        generate();
        System.out.println("\n文档生成结果：SUCCESS ...");
    }

    private static void generate() {
        // 生成文件配置
        EngineConfig engineConfig = EngineConfig.builder()
            // 生成文件路径，自己mac本地的地址，这里需要自己更换下路径
            .fileOutputDir(filePath)
            // 打开目录
            .openOutputDir(false)
            // 文件类型 HTML/WORD/MD 三种格式
            .fileType(EngineFileType.WORD)
            // 生成模板实现
            .produceType(EngineTemplateType.freemarker).build();

        //数据库名称
        String[] dbNames = {dataBase};
        for (String dbName : dbNames) {
            HikariDataSource hikariDataSource = new HikariDataSource();
            //设置数据库连接
            hikariDataSource.setJdbcUrl(driverUrl);
            hikariDataSource.setUsername(username);
            hikariDataSource.setPassword(password);
            // 生成文档配置（包含以下自定义版本号、描述等配置连接）
            Configuration config = Configuration.builder()
                .version("1.0.1")
                .description("数据库设计文档")
                .dataSource(hikariDataSource)
                .engineConfig(engineConfig)
                .produceConfig(getProcessConfig())
                .build();

            // 执行生成
            new DocumentationExecute(config).execute();
        }

    }

    /**
     * 配置想要生成的表+ 配置想要忽略的表
     * @return 生成表配置
     */
    private static ProcessConfig getProcessConfig(){
        // 忽略表名
        List<String> ignoreTableName = Arrays.asList("test_a","test_b");
        // 忽略表前缀
        List<String> ignorePrefix = Arrays.asList("test_a","test_b");
        // 忽略表后缀
        List<String> ignoreSuffix = Arrays.asList("a_test","b_test");
        return ProcessConfig.builder()
            //根据名称指定表生成 我需要生成所有表 这里暂时不设置
            .designatedTableName(new ArrayList<>())
            //根据表前缀生成 我需要生成所有表 这里暂时不设置
            .designatedTablePrefix(new ArrayList<>())
            //根据表后缀生成 我需要生成所有表 这里暂时不设置
            .designatedTableSuffix(new ArrayList<>())
            //忽略表名
            .ignoreTableName(ignoreTableName)
            //忽略表前缀
            .ignoreTablePrefix(ignorePrefix)
            //忽略表后缀
            .ignoreTableSuffix(ignoreSuffix).build();
    }

}
