//package com.mosty.common.generator.controller;
//
//import cn.hutool.core.convert.Convert;
//import com.alibaba.druid.DbType;
//import com.alibaba.druid.sql.SQLUtils;
//import com.alibaba.druid.sql.ast.SQLStatement;
//import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
//import com.alibaba.fastjson.JSON;
//import com.mosty.common.base.domain.BaseController;
//import com.mosty.common.base.domain.CxSelect;
//import com.mosty.common.base.domain.ResponseResult;
//import com.mosty.common.base.domain.TableDataInfo;
//import com.mosty.common.base.domain.page.SqlUtil;
//import com.mosty.common.base.entity.log.BusinessType;
//import com.mosty.common.base.entity.log.Log;
//import com.mosty.common.generator.domain.GenTable;
//import com.mosty.common.generator.domain.GenTableColumn;
//import com.mosty.common.generator.service.GenTableColumnService;
//import com.mosty.common.generator.service.GenTableService;
//import io.swagger.annotations.Api;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.io.IOUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
//import org.springframework.ui.ModelMap;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.*;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//
///**
// * 代码生成 操作处理
// *
// * @author ruoyi
// */
//@Slf4j
//@Controller
//@RequestMapping("/tool/gen")
//@Api(tags = "代码生成")
//public class GenController extends BaseController {
//
//    /** 前缀标识 */
//    private String prefix = "tool/gen";
//
//    @Autowired
//    private GenTableService genTableService;
//
//    @Autowired
//    private GenTableColumnService genTableColumnService;
//
//    //    @RequiresPermissions("tool:gen:view")
//    @GetMapping()
//    public String gen() {
//        return prefix + "/gen";
//    }
//
//    /**
//     * 查询代码生成列表
//     */
////    @RequiresPermissions("tool:gen:list")
//    @PostMapping("/list")
//    @ResponseBody
//    public ResponseResult<TableDataInfo> genList(GenTable genTable) {
//        startPage();
//        List<GenTable> list = genTableService.selectGenTableList(genTable);
//        TableDataInfo dataTable = getDataTable(list);
//        return ResponseResult.success(dataTable);
//    }
//
//    /**
//     * 查询数据库列表
//     */
////    @RequiresPermissions("tool:gen:list")
//    @PostMapping("/db/list")
//    @ResponseBody
//    public ResponseResult<TableDataInfo> dataList(GenTable genTable) {
//        startPage();
//        List<GenTable> list = genTableService.selectDbTableList(genTable);
//        TableDataInfo dataTable = getDataTable(list);
//        return ResponseResult.success(dataTable);
//    }
//
//    /**
//     * 查询数据表字段列表
//     */
////    @RequiresPermissions("tool:gen:list")
//    @PostMapping("/column/list")
//    @ResponseBody
//    public ResponseResult<TableDataInfo> columnList(GenTableColumn genTableColumn) {
//        TableDataInfo dataInfo = new TableDataInfo();
//        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(genTableColumn);
//        dataInfo.setRows(list);
//        dataInfo.setTotal(list.size());
//        return ResponseResult.success(dataInfo);
//    }
//
//    /**
//     * 导入表结构
//     */
////    @RequiresPermissions("tool:gen:list")
//    @GetMapping("/importTable")
//    public ResponseResult<String> importTable() {
//        return ResponseResult.success(prefix + "/importTable");
//    }
//
//    /**
//     * 创建表结构
//     */
//    @GetMapping("/createTable")
//    public ResponseResult<String> createTable() {
//        return ResponseResult.success(prefix + "/createTable");
//    }
//
//    /**
//     * 导入表结构（保存）
//     */
////    @RequiresPermissions("tool:gen:list")
//    @Log(title = "代码生成", businessType = BusinessType.IMPORT)
//    @PostMapping("/importTable")
//    @ResponseBody
//    public ResponseResult<Boolean> importTableSave(String tables) {
//        String[] tableNames = Convert.toStrArray(tables);
//        // 查询表信息
//        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
////        String operName = Convert.toStr(PermissionUtils.getPrincipalProperty("loginName"));
//        String operName = "kevin";
//        genTableService.importGenTable(tableList, operName);
//        return ResponseResult.success(Boolean.TRUE);
//    }
//
//    /**
//     * 修改代码生成业务
//     */
////    @RequiresPermissions("tool:gen:edit")
//    @GetMapping("/edit/{tableId}")
//    public ResponseResult<String> edit(@PathVariable("tableId") Long tableId, ModelMap mmap) {
//        GenTable table = genTableService.selectGenTableById(tableId);
//        List<GenTable> genTables = genTableService.selectGenTableAll();
//        List<CxSelect> cxSelect = new ArrayList<CxSelect>();
//        for (GenTable genTable : genTables) {
//            if (!Objects.equals(table.getTableName(), genTable.getTableName())) {
//                CxSelect cxTable = new CxSelect(genTable.getTableName(), genTable.getTableName() + '：' + genTable.getTableComment());
//                List<CxSelect> cxColumns = new ArrayList<CxSelect>();
//                for (GenTableColumn tableColumn : genTable.getColumns()) {
//                    cxColumns.add(new CxSelect(tableColumn.getColumnName(), tableColumn.getColumnName() + '：' + tableColumn.getColumnComment()));
//                }
//                cxTable.setS(cxColumns);
//                cxSelect.add(cxTable);
//            }
//        }
//        mmap.put("table", table);
//        mmap.put("data", JSON.toJSON(cxSelect));
//        return ResponseResult.success(prefix + "/edit");
//    }
//
//    /**
//     * 修改保存代码生成业务
//     */
////    @RequiresPermissions("tool:gen:edit")
//    @Log(title = "代码生成", businessType = BusinessType.UPDATE)
//    @PostMapping("/edit")
//    @ResponseBody
//    public ResponseResult<Boolean> editSave(@Validated GenTable genTable) {
//        genTableService.validateEdit(genTable);
//        genTableService.updateGenTable(genTable);
//        return ResponseResult.success(Boolean.TRUE);
//    }
//
//    //    @RequiresPermissions("tool:gen:remove")
//    @Log(title = "代码生成", businessType = BusinessType.DELETE)
//    @PostMapping("/remove")
//    @ResponseBody
//    public ResponseResult<Boolean> remove(String ids) {
//        genTableService.deleteGenTableByIds(ids);
//        return ResponseResult.success(Boolean.TRUE);
//    }
//
//    //    @RequiresRoles("admin")
//    @Log(title = "创建表", businessType = BusinessType.OTHER)
//    @PostMapping("/createTable")
//    @ResponseBody
//    public ResponseResult<Boolean> create(String sql) {
//        try {
//            SqlUtil.filterKeyword(sql);
//            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql);
//            List<String> tableNames = new ArrayList<>();
//            for (SQLStatement sqlStatement : sqlStatements) {
//                if (sqlStatement instanceof MySqlCreateTableStatement) {
//                    MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement;
//                    if (genTableService.createTable(createTableStatement.toString())) {
//                        String tableName = createTableStatement.getTableName().replaceAll("`", "");
//                        tableNames.add(tableName);
//                    }
//                }
//            }
//            List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames.toArray(new String[tableNames.size()]));
////            String operName = Convert.toStr(PermissionUtils.getPrincipalProperty("loginName"));
//            String operName = "kevin";
//            genTableService.importGenTable(tableList, operName);
//            return ResponseResult.success(Boolean.TRUE);
//        } catch (Exception e) {
//            log.error(e.getMessage(), e);
//            return ResponseResult.fail("创建表结构异常[" + e.getMessage() + "]");
//        }
//    }
//
//    /**
//     * 预览代码
//     */
////    @RequiresPermissions("tool:gen:preview")
//    @GetMapping("/preview/{tableId}")
//    @ResponseBody
//    public ResponseResult<Map<String,String>> preview(@PathVariable("tableId") Long tableId) throws IOException {
//        Map<String, String> dataMap = genTableService.previewCode(tableId);
//        return ResponseResult.success(dataMap);
//    }
//
//    /**
//     * 生成代码（下载方式）
//     */
////    @RequiresPermissions("tool:gen:code")
//    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
//    @GetMapping("/download/{tableName}")
//    public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException {
//        byte[] data = genTableService.downloadCode(tableName);
//        genCode(response, data);
//    }
//
//    /**
//     * 生成代码（自定义路径）
//     */
////    @RequiresPermissions("tool:gen:code")
//    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
//    @GetMapping("/genCode/{tableName}")
//    @ResponseBody
//    public ResponseResult<Boolean> genCode(@PathVariable("tableName") String tableName) {
//        genTableService.generatorCode(tableName);
//        return ResponseResult.success(Boolean.TRUE);
//    }
//
//    /**
//     * 同步数据库
//     */
////    @RequiresPermissions("tool:gen:edit")
//    @Log(title = "代码生成", businessType = BusinessType.UPDATE)
//    @GetMapping("/synchDb/{tableName}")
//    @ResponseBody
//    public ResponseResult<Boolean> synchDb(@PathVariable("tableName") String tableName) {
//        genTableService.synchDb(tableName);
//        return ResponseResult.success(Boolean.TRUE);
//    }
//
//    /**
//     * 批量生成代码
//     */
////    @RequiresPermissions("tool:gen:code")
//    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
//    @GetMapping("/batchGenCode")
//    @ResponseBody
//    public void batchGenCode(HttpServletResponse response, String tables) throws IOException {
//        String[] tableNames = Convert.toStrArray(tables);
//        byte[] data = genTableService.downloadCode(tableNames);
//        genCode(response, data);
//    }
//
//    /**
//     * 生成zip文件
//     */
//    private void genCode(HttpServletResponse response, byte[] data) throws IOException {
//        response.reset();
//        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
//        response.addHeader("Content-Length", "" + data.length);
//        response.setContentType("application/octet-stream; charset=UTF-8");
//        IOUtils.write(data, response.getOutputStream());
//    }
//}