package com.github.hykes.codegen.gui;

import com.github.hykes.codegen.gui.cmt.JBalloon;
import com.github.hykes.codegen.gui.cmt.MyDialogWrapper;
import com.github.hykes.codegen.model.IdeaContext;
import com.github.hykes.codegen.model.Table;
import com.github.hykes.codegen.parser.DefaultParser;
import com.github.hykes.codegen.parser.Parser;
import com.github.hykes.codegen.provider.FileProviderFactory;
import com.github.hykes.codegen.utils.NotifyUtil;
import com.github.hykes.codegen.utils.StringUtils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.ui.MessageType;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.ui.JBUI;

import javax.swing.*;
import java.awt.*;
import java.util.List;

/**
 * @author [email protected]
 * @date 2017/12/19
 */
public class SqlEditorPanel implements ActionOperator {

    private static final Logger LOGGER = Logger.getInstance(SqlEditorPanel.class);

    private IdeaContext ideaContext;
    private JPanel rootPanel;
    private Editor sqlTextArea;
    private JPanel sqlPanel;
    private JScrollPane sqlScrollPane;

    public SqlEditorPanel(IdeaContext ideaContext) {
        this.ideaContext = ideaContext;
        $$$setupUI$$$();
    }

    private void disable() {
        $$$getRootComponent$$$().getRootPane().getParent().setEnabled(false);
        $$$getRootComponent$$$().getRootPane().getParent().setVisible(false);
    }

    private void createUIComponents() {
        // TODO: place custom component creation code here
        rootPanel = new JPanel();
        sqlPanel = new JPanel();
        sqlPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        sqlPanel.setPreferredSize(JBUI.size(600, 360));
        // 设置 sql text editor
        Document document = EditorFactory.getInstance().createDocument("");
        sqlTextArea = EditorFactory.getInstance().createEditor(document, ideaContext.getProject(), FileProviderFactory.getFileType("SQL"), false);

        sqlScrollPane = new JBScrollPane();
        sqlScrollPane.setViewportView(sqlTextArea.getComponent());
    }

    public JComponent getRootComponent() {
        return rootPanel;
    }

    /**
     * 执行OK的动作
     */
    @Override
    public void ok() {
        try {
            String sqls = sqlTextArea.getDocument().getText();
            Parser parser = new DefaultParser();
            List<Table> tables = parser.parseSQLs(sqls);
            if (tables == null || tables.isEmpty()) {
                NotifyUtil.notice("CodeGen-SQL", "please check sql format !", MessageType.ERROR);
                return;
            }

            ColumnEditorFrame frame = new ColumnEditorFrame();
            frame.newColumnEditorBySql(ideaContext, tables);
            MyDialogWrapper frameWrapper = new MyDialogWrapper(ideaContext.getProject(), frame.getRootPane());
            frameWrapper.setActionOperator(frame);
            frameWrapper.setTitle("CodeGen-SQL");
            frameWrapper.setSize(800, 550);
            frameWrapper.setResizable(false);
            frameWrapper.show();

            disable();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage());
        }

        // this.rootPanel.registerKeyboardAction(e -> disable(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
    }

    @Override
    public void cancel() { }

    @Override
    public boolean valid() {
        // 1. check empty
        String sqls = sqlTextArea.getDocument().getText();
        if (StringUtils.isBlank(sqls)) {
            JBalloon.buildSimple("Input sqls can not be empty!")
                    .show(RelativePoint.getSouthOf(this.sqlScrollPane));
            return false;
        }
        // 2. check parse
        Parser parser = new DefaultParser();
        List<Table> tables = parser.parseSQLs(sqls);
        if (tables == null || tables.isEmpty()) {
            JBalloon.buildSimple("Can not parse sqls, please check sql format!")
                    .show(RelativePoint.getSouthOf(this.sqlScrollPane));
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("CodeGen-SQL");
        frame.setContentPane(new SqlEditorPanel(null).$$$getRootComponent$$$());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     *
     * @noinspection ALL
     */
    private void $$$setupUI$$$() {
        createUIComponents();
        rootPanel.setLayout(new BorderLayout(0, 0));
        sqlPanel.setLayout(new BorderLayout(0, 0));
        rootPanel.add(sqlPanel, BorderLayout.CENTER);
        sqlPanel.add(sqlScrollPane, BorderLayout.CENTER);
    }

    /**
     * @noinspection ALL
     */
    public JComponent $$$getRootComponent$$$() {
        return rootPanel;
    }
}