/*******************************************************************************
 * Copyright (c) 2017 Pegasystems Inc. All rights reserved.
 *
 * Contributors:
 *     Manu Varghese
 *******************************************************************************/

package com.pega.gcs.tracerviewer.view;

import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;

import com.pega.gcs.fringecommon.guiutilities.CustomJTable;
import com.pega.gcs.fringecommon.guiutilities.treetable.DefaultTreeTableTreeModel;
import com.pega.gcs.fringecommon.guiutilities.treetable.TreeTableColumn;
import com.pega.gcs.tracerviewer.TraceEventTreeNode;
import com.pega.gcs.tracerviewer.TraceNavigationTableController;
import com.pega.gcs.tracerviewer.TraceTableModel;
import com.pega.gcs.tracerviewer.TraceTableModelColumn;
import com.pega.gcs.tracerviewer.TraceTreeTable;
import com.pega.gcs.tracerviewer.TraceTreeTableMouseListener;

public class TracerDataTreeTableView extends TracerDataSingleView {

    private static final long serialVersionUID = -2065567512444191531L;

    private static final String EXPAND_ALL_ACTION = "Expand all nodes";

    private static final String COLLAPSE_ALL_ACTION = "Collapse all nodes";

    private TraceTreeTable traceTreeTable;

    private JButton expandAllJButton;

    public TracerDataTreeTableView(TraceTableModel traceTableModel, JPanel supplementUtilityJPanel,
            TraceNavigationTableController traceNavigationTableController) {
        super(traceTableModel, supplementUtilityJPanel, traceNavigationTableController);
    }

    @Override
    protected CustomJTable getTracerDataTable() {

        if (traceTreeTable == null) {

            TraceTableModel traceTableModel = getTraceTableModel();

            TraceEventTreeNode root = traceTableModel.getRootTraceEventTreeNode();

            TraceTableModelColumn[] traceTreeTableModelColumnArray;
            traceTreeTableModelColumnArray = TraceTableModelColumn.getTraceTreeTableModelColumnArray();

            TreeTableColumn[] columns = getTreeTableColumnArray(traceTreeTableModelColumnArray);

            DefaultTreeTableTreeModel dtttm = new DefaultTreeTableTreeModel(root, columns);

            traceTreeTable = new TraceTreeTable(dtttm, traceTableModel);

            TraceTreeTableMouseListener traceTreeTableMouseListener = new TraceTreeTableMouseListener(this);

            traceTreeTableMouseListener.addTraceTreeTable(traceTreeTable);

            traceTreeTable.addMouseListener(traceTreeTableMouseListener);
        }

        return traceTreeTable;
    }

    @Override
    protected JPanel getAdditionalUtilityPanel() {

        JPanel additionalUtilityPanel = new JPanel();

        LayoutManager layout = new BoxLayout(additionalUtilityPanel, BoxLayout.LINE_AXIS);

        additionalUtilityPanel.setLayout(layout);

        JButton expandAllJButton = getExpandAllJButton();

        additionalUtilityPanel.add(expandAllJButton);

        return additionalUtilityPanel;

    }

    protected JButton getExpandAllJButton() {

        if (expandAllJButton == null) {

            expandAllJButton = new JButton(EXPAND_ALL_ACTION);
            expandAllJButton.setActionCommand(EXPAND_ALL_ACTION);

            Dimension dim = new Dimension(150, 20);
            expandAllJButton.setPreferredSize(dim);
            expandAllJButton.setMaximumSize(dim);

            expandAllJButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent event) {

                    JButton expandAllJButton = getExpandAllJButton();

                    TraceTreeTable traceTreeTable = (TraceTreeTable) getTracerDataTable();

                    if (EXPAND_ALL_ACTION.equals(event.getActionCommand())) {

                        if (traceTreeTable != null) {
                            traceTreeTable.expandAll(true);
                        }

                        expandAllJButton.setText(COLLAPSE_ALL_ACTION);
                        expandAllJButton.setActionCommand(COLLAPSE_ALL_ACTION);

                    } else {

                        if (traceTreeTable != null) {
                            traceTreeTable.expandAll(false);
                        }

                        expandAllJButton.setText(EXPAND_ALL_ACTION);
                        expandAllJButton.setActionCommand(EXPAND_ALL_ACTION);

                    }

                }
            });
        }

        return expandAllJButton;
    }

    protected TreeTableColumn[] getTreeTableColumnArray(TraceTableModelColumn[] traceTableModelColumnArray) {

        TreeTableColumn[] columns = null;
        int columnIndex = 0;
        String columnName;
        int prefColumnWidth;
        int alignment;
        Class<?> columnClass;

        int size = traceTableModelColumnArray.length;
        columns = new TreeTableColumn[size];

        for (TraceTableModelColumn traceTableModelColumn : traceTableModelColumnArray) {

            columnName = traceTableModelColumn.getName();
            prefColumnWidth = traceTableModelColumn.getPrefColumnWidth();
            alignment = traceTableModelColumn.getHorizontalAlignment();
            columnClass = traceTableModelColumn.getColumnClass();

            TreeTableColumn column = new TreeTableColumn(columnName, prefColumnWidth, alignment, columnClass);
            columns[columnIndex] = column;
            columnIndex++;
        }

        return columns;
    }
}