package cn.meowrain.aioj.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Collections;

/**
 * MyBatis Plus 代码生成器
 * <p>
 * 使用方法：
 * 1. 修改下方的数据库连接配置
 * 2. 修改要生成的表名
 * 3. 修改输出路径和包名
 * 4. 运行 main 方法
 * </p>
 * <p>
 * 生成规则：
 * - Entity: XxxDO (数据对象)
 * - Controller: /v1/xxx (RESTful 风格，包含 CRUD)
 * </p>
 *
 * @author meowrain
 * @since 1.0.0
 */
public class CodeGenerator {

    // ==================== 数据库配置 ====================
    /** 数据库地址 */
    private static final String DB_URL = "jdbc:mysql://10.0.0.10:3306/aioj_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
    /** 数据库用户名 */
    private static final String DB_USERNAME = "root";
    /** 数据库密码 */
    private static final String DB_PASSWORD = "root";

    // ==================== 代码生成配置 ====================
    /** 作者名 */
    private static final String AUTHOR = "meowrain";
    /** 父包名 */
    private static final String PARENT_PACKAGE = "cn.meowrain.aioj.backend";
    /** 模块名 (如: userservice, questionservice) */
    private static final String MODULE_NAME = "question.service";
    /** 要生成的表名 (多个表用逗号分隔) */
    private static final String[] TABLE_NAMES = {"question"};
    /** 表前缀 (生成时会去掉前缀) */
    private static final String[] TABLE_PREFIX = {""};

    // ==================== 输出路径配置 ====================
    /** 代码输出目录 (默认当前项目的 src/main/java) */
    private static final String OUTPUT_DIR = System.getProperty("user.dir") + "/generator/src/main/java";
    /** Mapper XML 输出目录 */
    private static final String MAPPER_XML_DIR = System.getProperty("user.dir") + "/generator/src/main/resources/mapper";

    public static void main(String[] args) {
        generateCode();
    }

    /**
     * 执行代码生成
     */
    public static void generateCode() {
        FastAutoGenerator.create(DB_URL, DB_USERNAME, DB_PASSWORD)
                // 全局配置
                .globalConfig(builder -> builder
                        .author(AUTHOR)
                        .outputDir(OUTPUT_DIR)
                        .dateType(DateType.TIME_PACK)  // 使用 Java 8 日期类型
                        .commentDate("yyyy-MM-dd")
                        .disableOpenDir()  // 生成后不打开目录
                )
                // 包配置
                .packageConfig(builder -> builder
                        .parent(PARENT_PACKAGE)
                        .moduleName(MODULE_NAME)
                        .entity("dao.entity")
                        .mapper("dao.mapper")
                        .service("service")
                        .serviceImpl("service.impl")
                        .controller("controller")
                        .xml("mapper")
                        .pathInfo(Collections.singletonMap(OutputFile.xml, MAPPER_XML_DIR))
                )
                // 策略配置
                .strategyConfig(builder -> builder
                        .addInclude(TABLE_NAMES)
                        .addTablePrefix(TABLE_PREFIX)
                        // Entity 策略: 生成 XxxDO
                        .entityBuilder()
                        .formatFileName("%sDO")  // 实体类后缀改为 DO
                        .enableLombok()
                        .enableTableFieldAnnotation()
                        .naming(NamingStrategy.underline_to_camel)
                        .columnNaming(NamingStrategy.underline_to_camel)
                        .idType(IdType.ASSIGN_ID)  // 雪花算法ID
                        .addTableFills(new Column("create_time", FieldFill.INSERT))
                        .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
                        .logicDeleteColumnName("is_delete")
                        .logicDeletePropertyName("isDelete")
                        // Mapper 策略
                        .mapperBuilder()
                        .enableBaseResultMap()
                        .enableBaseColumnList()
                        // Service 策略
                        .serviceBuilder()
                        .formatServiceFileName("%sService")
                        .formatServiceImplFileName("%sServiceImpl")
                        // Controller 策略
                        .controllerBuilder()
                        .enableRestStyle()
                )
                // 自定义模板 (使用 /templates/ 目录下的模板)
                .templateConfig(builder -> builder
                        .entity("/templates/entityDO.java")
                        .controller("/templates/controller.java")
                        .service("/templates/service.java")
                        .serviceImpl("/templates/serviceImpl.java")
                        .mapper("/templates/mapper.java")
                        .xml("/templates/mapper.xml")
                )
                // 模板引擎
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();

        System.out.println("========== 代码生成完成 ==========");
        System.out.println("输出目录: " + OUTPUT_DIR);
        System.out.println("Mapper XML: " + MAPPER_XML_DIR);
        System.out.println();
        System.out.println("生成规则:");
        System.out.println("  - Entity: XxxDO");
        System.out.println("  - Controller: /v1/xxx (包含 CRUD 增删改查)");
    }
}
