import treeService from "../services/tree.js";
import utils from "../services/utils.js";
import ws from "../services/ws.js";
import toastService from "../services/toast.js";
import froca from "../services/froca.js";
import openService from "../services/open.js";

const $dialog = $("#export-dialog");
const $form = $("#export-form");
const $noteTitle = $dialog.find(".export-note-title");
const $subtreeFormats = $("#export-subtree-formats");
const $singleFormats = $("#export-single-formats");
const $subtreeType = $("#export-type-subtree");
const $singleType = $("#export-type-single");
const $exportButton = $("#export-button");
const $opmlVersions = $("#opml-versions");

let taskId = '';
let branchId = null;

export async function showDialog(notePath, defaultType) {
    // each opening of the dialog resets the taskId so we don't associate it with previous exports anymore
    taskId = '';
    $exportButton.removeAttr("disabled");

    if (defaultType === 'subtree') {
        $subtreeType.prop("checked", true).trigger('change');

        // to show/hide OPML versions
        $("input[name=export-subtree-format]:checked").trigger('change');
    }
    else if (defaultType === 'single') {
        $singleType.prop("checked", true).trigger('change');
    }
    else {
        throw new Error("Unrecognized type " + defaultType);
    }

    $("#opml-v2").prop("checked", true); // setting default

    utils.openDialog($dialog);

    const {noteId, parentNoteId} = treeService.getNoteIdAndParentIdFromNotePath(notePath);

    branchId = await froca.getBranchId(parentNoteId, noteId);

    const noteTitle = await treeService.getNoteTitle(noteId);

    $noteTitle.html(noteTitle);
}

$form.on('submit', () => {
    $dialog.modal('hide');

    const exportType = $dialog.find("input[name='export-type']:checked").val();

    if (!exportType) {
        // this shouldn't happen as we always choose default export type
        alert("Choose export type first please");
        return;
    }

    const exportFormat = exportType === 'subtree'
        ? $("input[name=export-subtree-format]:checked").val()
        : $("input[name=export-single-format]:checked").val();

    const exportVersion = exportFormat === 'opml' ? $dialog.find("input[name='opml-version']:checked").val() : "1.0";

    exportBranch(branchId, exportType, exportFormat, exportVersion);

    return false;
});

function exportBranch(branchId, type, format, version) {
    taskId = utils.randomString(10);

    const url = openService.getUrlForDownload(`api/notes/${branchId}/export/${type}/${format}/${version}/${taskId}`);

    openService.download(url);
}

$('input[name=export-type]').on('change', function () {
    if (this.value === 'subtree') {
        if ($("input[name=export-subtree-format]:checked").length === 0) {
            $("input[name=export-subtree-format]:first").prop("checked", true);
        }

        $subtreeFormats.slideDown();
        $singleFormats.slideUp();
    }
    else {
        if ($("input[name=export-single-format]:checked").length === 0) {
            $("input[name=export-single-format]:first").prop("checked", true);
        }

        $subtreeFormats.slideUp();
        $singleFormats.slideDown();
    }
});

$('input[name=export-subtree-format]').on('change', function () {
    if (this.value === 'opml') {
        $opmlVersions.slideDown();
    }
    else {
        $opmlVersions.slideUp();
    }
});

function makeToast(id, message) {
    return {
        id: id,
        title: "Export status",
        message: message,
        icon: "arrow-square-up-right"
    };
}

ws.subscribeToMessages(async message => {
    if (message.taskType !== 'export') {
        return;
    }

    if (message.type === 'taskError') {
        toastService.closePersistent(message.taskId);
        toastService.showError(message.message);
    }
    else if (message.type === 'taskProgressCount') {
        toastService.showPersistent(makeToast(message.taskId, "Export in progress: " + message.progressCount));
    }
    else if (message.type === 'taskSucceeded') {
        const toast = makeToast(message.taskId, "Export finished successfully.");
        toast.closeAfter = 5000;

        toastService.showPersistent(toast);
    }
});
