import appContext, { type EventData } from "./app_context.js";
import noteCreateService from "../services/note_create.js";
import treeService from "../services/tree.js";
import hoistedNoteService from "../services/hoisted_note.js";
import Component from "./component.js";

/**
 * This class contains command executors which logically belong to the NoteTree widget, but for better user experience,
 * the keyboard shortcuts must be active on the whole screen and not just on the widget itself, so the executors
 * must be at the root of the component tree.
 */
export default class MainTreeExecutors extends Component {
    get tree() {
        return appContext.noteTreeWidget;
    }

    async cloneNotesToCommand({ selectedOrActiveNoteIds }: EventData<"cloneNotesTo">) {
        if (!this.tree) {
            return;
        }

        this.triggerCommand("cloneNoteIdsTo", { noteIds: selectedOrActiveNoteIds });
    }

    async moveNotesToCommand({ selectedOrActiveBranchIds }: EventData<"moveNotesTo">) {
        if (!this.tree) {
            return;
        }

        this.triggerCommand("moveBranchIdsTo", { branchIds: selectedOrActiveBranchIds });
    }

    async createNoteIntoCommand() {
        const activeNoteContext = appContext.tabManager.getActiveContext();

        if (!activeNoteContext || !activeNoteContext.notePath || !activeNoteContext.note) {
            return;
        }

        await noteCreateService.createNote(activeNoteContext.notePath, {
            isProtected: activeNoteContext.note.isProtected,
            saveSelection: false
        });
    }

    async createNoteAfterCommand() {
        if (!this.tree) {
            return;
        }

        const node = this.tree.getActiveNode();

        if (!node) {
            return;
        }

        const parentNotePath = treeService.getNotePath(node.getParent());
        const isProtected = treeService.getParentProtectedStatus(node);

        if (node.data.noteId === "root" || node.data.noteId === hoistedNoteService.getHoistedNoteId()) {
            return;
        }

        await noteCreateService.createNote(parentNotePath, {
            target: "after",
            targetBranchId: node.data.branchId,
            isProtected: isProtected,
            saveSelection: false
        });
    }
}
