/**
 * erlyberly, erlang trace debugger
 * Copyright (C) 2016 Andy Till
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package erlyberly;


import java.util.ArrayList;

import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.KeyCombination;

public class TraceContextMenu extends ContextMenu {

    private final DbgController dbgController;

    private ObservableList<TraceLog> items, selectedItems;

    public TraceContextMenu(DbgController aDbgContoller) {
        dbgController = aDbgContoller;
        getItems().add(menuItem("Copy All", "shortcut+c", this::onCopy));
        getItems().add(menuItem("Copy Function Call", null, this::onCopyCalls));
        getItems().add(new SeparatorMenuItem());
        getItems().add(menuItem("Delete", "delete", this::onDelete));
        getItems().add(menuItem("Delete All", "shortcut+n", this::onDeleteAll));
        getItems().add(menuItem("Add Breaker", "shortcut+b", this::onAddBreaker));
        getItems().add(menuItem("Toggle Trace", null, this::onTraceToggle));
    }

    private MenuItem menuItem(String text, String accelerator, EventHandler<ActionEvent> e) {
        MenuItem menuItem;

        menuItem = new MenuItem(text);
        menuItem.setOnAction(e);

        if(accelerator != null)
            menuItem.setAccelerator(KeyCombination.keyCombination(accelerator));

        return menuItem;
    }

    private void onCopy(ActionEvent e) {
        StringBuilder sbuilder = new StringBuilder();

        for (TraceLog traceLog : selectedItems) {
            sbuilder.append(traceLog.toString()).append("\n");
        }

        copyToClipboard(sbuilder);
    }

    private void onCopyCalls(ActionEvent e) {
        StringBuilder sbuilder = new StringBuilder();

        for (TraceLog traceLog : selectedItems) {
            sbuilder.append(traceLog.toCallString()).append("\n");
        }

        copyToClipboard(sbuilder);
    }

    private void copyToClipboard(StringBuilder sbuilder) {
        final Clipboard clipboard = Clipboard.getSystemClipboard();
        final ClipboardContent content = new ClipboardContent();

        content.putString(sbuilder.toString());
        clipboard.setContent(content);
    }

    private void onTraceToggle(ActionEvent e) {
        for (TraceLog log : selectedItems) {
            dbgController.toggleTraceModFunc(log.getModFunc());
        }
    }

    private void onDelete(ActionEvent e) {
        ArrayList<TraceLog> arrayList = new ArrayList<TraceLog>(selectedItems);
        items.removeAll(arrayList);
    }

    private void onDeleteAll(ActionEvent e) {
        items.clear();
    }

    public void setSelectedItems(ObservableList<TraceLog> selectedItems2) {
        selectedItems = selectedItems2;
    }

    public void setItems(ObservableList<TraceLog> items2) {
        items = items2;
    }

    private void onAddBreaker(ActionEvent e) {
        items.add(TraceLog.newBreakLog());
    }
}