package li.ktt;

import com.intellij.database.DatabaseDataKeys;
import com.intellij.database.datagrid.DataGrid;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.ide.CopyPasteManager;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.util.ui.TextTransferable;
import li.ktt.datagrid.DataGridHelper;
import li.ktt.settings.ExtractorProperties;
import li.ktt.settings.ProjectSettings;
import li.ktt.xml.XmlGenerator;
import li.ktt.xml.XmlOutput;
import org.jetbrains.annotations.NotNull;

public class CopyToDbUnit extends AnAction {

    public void actionPerformed(@NotNull AnActionEvent e) {
        DataContext dataContext = e.getDataContext();
        DataGrid dataGrid = DatabaseDataKeys.DATA_GRID_KEY.getData(dataContext);
        ExtractorProperties extractorProperties = ProjectSettings.getExtractorProperties(dataContext);
        XmlOutput xmlOutput = actionPerformed(extractorProperties, dataGrid, dataContext);
        copyOutput(xmlOutput);
        showPopup(dataContext, xmlOutput);
    }

    public XmlOutput actionPerformed(ExtractorProperties extractorProperties, DataGrid dataGrid, DataContext dataContext) {
        XmlOutput result = null;
        if (dataGrid != null) {
            DataGridHelper data = new DataGridHelper(extractorProperties, dataGrid);
            XmlGenerator xmlGenerator = new XmlGenerator(extractorProperties, data);
            xmlGenerator.appendRows();
            result = xmlGenerator.getOutput();
        }
        return result;
    }

    private void copyOutput(XmlOutput xmlOutput) {
        CopyPasteManager.getInstance().setContents(new TextTransferable(xmlOutput.getText()));
    }

    private void showPopup(DataContext dataContext, XmlOutput xmlOutput) {
        MessageType messageType = MessageType.INFO;
        String htmlMessage = "";
        if (xmlOutput != null && xmlOutput.getRowSize() > 0 && xmlOutput.getColumnsSize() > 0) {
            if (xmlOutput.getTableName() == null || xmlOutput.getTableName().isEmpty()) {
                messageType = MessageType.WARNING;
                htmlMessage += "Table name is missing. Please try to synchronize database connection. <br/>";
            }
            htmlMessage += "Copied: " + xmlOutput.getRowSize() + " entries (selected " + xmlOutput.getColumnsSize() + " columns)";
        } else {
            messageType = MessageType.ERROR;
            if (xmlOutput == null) {
                htmlMessage = "Failed to copy entries. No grid available.";
            } else if (xmlOutput.getRowSize() <= 0) {
                htmlMessage = "No rows selected.";
            } else if (xmlOutput.getColumnsSize() <= 0) {
                htmlMessage = "No columns selected.";
            }
        }
        JBPopupFactory.getInstance()
                .createHtmlTextBalloonBuilder(htmlMessage, messageType, null)
                .setFadeoutTime(7500)
                .createBalloon().show(JBPopupFactory.getInstance().guessBestPopupLocation(dataContext), Balloon.Position.atRight);
    }

}