package com.casic.missiles.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: mybatis-plus代码生成器
 * @Author: wangpeng
 * @Date: 2022/8/11 17:52
 */
@RestController
@RequestMapping("/code")
public class AutoCodeGenerator {

    private static String driverClassName;  // 驱动名称
    private static String username;  // 数据库用户名
    private static String password;  // 数据库用户密码
    private static String url;  // 数据库连接URL
    private static String author;  // 作者
    private static String tableName;  // 待生成对象表名

    /**
     * 读取 application.properties 配置文件
     */
    private static void readProperty() {
        Environment environment = SpringContextUtil.getApplicationContext().getEnvironment();
        driverClassName = environment.getProperty("spring.datasource.driver-class-name");
        username = environment.getProperty("spring.datasource.username");
        password = environment.getProperty("spring.datasource.password");
        url = environment.getProperty("spring.datasource.url");
        author = environment.getProperty("code.generate.author");
        tableName = environment.getProperty("code.generate.table-name");
    }

    /**
     * MyBatis-Plus 代码生成器「新」
     * 适用版本：mybatis-plus-generator 3.5.1 及其以上版本，对历史版本不兼容
     */
    @GetMapping("generator")
    public static void main(String [] args) {
        // 加载数据库配置
        readProperty();
        // 项目路径
        String projectPath = System.getProperty("user.dir");
        // 根据数据源信息，创建文件，生成代码
        FastAutoGenerator.create(new DataSourceConfig.Builder(url,username,password))
                // 全局配置
                .globalConfig(builder -> builder
                        // 作者
                        .author(author)
                        // 输出路径
                        .outputDir(projectPath + "/target/generated-sources")
                        .dateType(DateType.TIME_PACK)
                )
                // 包配置
                .packageConfig(builder -> builder
                        // 指定父包名
                        .parent("com.casic.missiles")
                        .entity("model")
                        .service("service")
                        .serviceImpl("service.impl")
                        .mapper("mapper")
                        .controller("controller"))
                // 模版配置
//                .templateConfig(builder -> builder
//                        .entity("/templates/entity.java")
//                        .service("/templates/service.java")
//                        .serviceImpl("/templates/serviceImpl.java")
//                        .mapper("/templates/mapper.java")
//                        .controller("/templates/controller.java"))
                // 策略配置
                .strategyConfig(builder -> builder
                        // 指定表名，用逗号分隔
                        .addInclude(tableName.split(","))
                        // 先开启 Controller 配置
                        .controllerBuilder()
                        // 开启生成 @RestController 控制器
                        .enableRestStyle()
                        // 开启驼峰转连字符
                        .enableHyphenStyle()
                        // 先开启 Entity 配置
                        .entityBuilder()
                        // 开启主键自增
//                        .idType(IdType.AUTO)
                        // 数据库表映射到实体的命名策略，驼峰命名
                        .naming(NamingStrategy.underline_to_camel)
                        // 数据库表字段映射到实体的命名策略，驼峰命名
                        .columnNaming(NamingStrategy.underline_to_camel)
                        // 开启生成实体时生成字段注解
                        .enableTableFieldAnnotation()
                        .enableLombok()
                        .mapperBuilder()
                        .enableBaseResultMap()
                        .enableBaseColumnList())
                // 执行
                .execute();
    }
}
