package com.github.hykes.codegen.gui;

import com.github.hykes.codegen.configurable.SettingManager;
import com.github.hykes.codegen.model.CodeContext;
import com.github.hykes.codegen.model.CodeRoot;
import com.github.hykes.codegen.model.Field;
import com.github.hykes.codegen.model.IdeaContext;
import com.github.hykes.codegen.model.Table;
import com.github.hykes.codegen.utils.GuiUtil;
import com.intellij.database.model.DasColumn;
import com.intellij.database.psi.DbTable;
import com.intellij.database.util.DasUtil;
import com.intellij.ui.components.JBTabbedPane;
import com.intellij.util.containers.JBIterable;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

/**
 * 字段自定义编辑器
 *
 * @author [email protected]
 * @date 2017/5/12
 */
public class ColumnEditorFrame extends JFrame implements ActionOperator {

    private final SettingManager SETTING_MANAGER = SettingManager.getInstance();

    private final List<TablePanel> panels = new ArrayList<>();
    private ActionListener generateAction;

    public void newColumnEditorByDb(IdeaContext ideaContext, List<DbTable> dbTables) {
        List<Table> tables = new ArrayList<>();
        for (DbTable dbTable: dbTables) {
            Table table = new Table();
            table.setTableName(dbTable.getName());

            List<Field> fields = new ArrayList<>();

            JBIterable<? extends DasColumn> columnsIter = DasUtil.getColumns(dbTable);
            List<? extends DasColumn> dasColumns = columnsIter.toList();
            for (DasColumn dasColumn : dasColumns) {
                Field field = new Field();
                field.setColumn(dasColumn.getName());
                field.setColumnType(dasColumn.getDataType().typeName);
                field.setColumnSize(String.valueOf(dasColumn.getDataType().size));
                field.setComment(dasColumn.getComment());
                fields.add(field);
            }
            table.setFields(fields);
            tables.add(table);
        }
        init(ideaContext, tables);

        // esc
        this.getRootPane().registerKeyboardAction(e -> dispose(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
    }

    public void newColumnEditorBySql(IdeaContext ideaContext, List<Table> tables) {
        init(ideaContext, tables);
        // esc
        this.getRootPane().registerKeyboardAction(e -> dispose(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
    }

    private void init(IdeaContext ideaContext, List<Table> tables){
        setLayout(new BorderLayout());
        JBTabbedPane tabbedPane = new JBTabbedPane();

        for (Table table: tables) {
            TablePanel tablePanel = new TablePanel(table);
            tabbedPane.add(tablePanel.getRootComponent(), table.getTableName());
            panels.add(tablePanel);
        }

        List<CodeRoot> codeRoots =  SETTING_MANAGER.getTemplates().getRoots();
        SelectGroupPanel selectGroupPanel = new SelectGroupPanel(codeRoots, ideaContext.getProject());
        generateAction = it -> {
            if(selectGroupPanel.hasSelected()) {
                List<CodeContext> contexts = new ArrayList<>();

                for (TablePanel panel: panels) {
                    String modelName = panel.getModelTextField().getText().trim();
                    String tableName = panel.getTableTextField().getText().trim();
                    String comment = panel.getCommentTextField().getText().trim();
                    // 组装数据
                    CodeContext context = new CodeContext(modelName, tableName, comment, panel.getFields());
                    contexts.add(context);
                }
                GuiUtil.generateFile(ideaContext, contexts, selectGroupPanel.getGroupPathMap());
                dispose();
            }
        };

        add(tabbedPane, BorderLayout.CENTER);
        selectGroupPanel.getRootPanel().setBorder(BorderFactory.createEmptyBorder(0, 15, 10, 15));
        add(selectGroupPanel.getRootPanel(), BorderLayout.SOUTH);
    }

    @Override
    public void ok() {
        this.generateAction.actionPerformed(null);
    }

    @Override
    public void cancel() { }

    @Override
    public boolean valid() { return true; }

}