/**
 * Gère la création d'un document
 * @param  {...any} args 
 */
function RoundriveCreate(...args)
{
    this.init(...args);
}

/**
 * Initialise l'objet
 */
RoundriveCreate.prototype.init = function()
{
    this.item = $("#roundrive-create");
    this.buttons = {
        parent:$("#roundrive-elements")
    }
    this.folders = $("#roundrive-folders");

    this.inputs={
        name:$("#generated-document-input-mel-metapage"),
        folder:$("#roundrive-folder-input"),
        models:$("#models-input"),
    };

    this.create_buttons();
}

/**
 * Créer les boutons pour choisir un type de document
 */
RoundriveCreate.prototype.create_buttons = function()
{
    let html = "";

    for (let index = 0; index < rcmail.env.mel_metapage_templates_doc.length; index++) {
        const element = rcmail.env.mel_metapage_templates_doc[index];
        html += '<div class=col-md-3><button data-doc="'+element.type+'" type=button class="doc-'+element.type+' btn-template-doc btn btn-block btn-secondary btn-mel" onclick="m_mp_UpdateCreateDoc(`'+JSON.stringify(element).replace(/"/g, "¤¤¤")+'`)"><span style="display:block;margin-right:0px" class="'+m_mp_CreateDocumentIconContract(element.icon)+'"></span>'+ rcmail.gettext("mel_metapage." + element.name) +'</button></div>';
    }

    this.buttons.parent.html(`<div class=row>${html}</div>`);

    this.buttons.parent.find("button").each((i,e) => {
        e = $(e);
        this.buttons[e.data("doc")] = e;
    });
}


/**
 * Selectionne un dossier.
 * @param {DOMElement} event Dossier à séléctionner. 
 */
RoundriveCreate.prototype.select = function(event)
{
    event = $(event).parent();
    this.folders.find(".selected").removeClass("selected");
    event.addClass("selected");
    $("input.roundrive-folder").val(event.data("path"));
}

/**
 * Affiche la fenêtre de choix des documents
 */
RoundriveCreate.prototype.choose_document = function()
{
    this.item.css("display", "none");
    this.folders.css("display", "");
}

/**
 * Ferme le fenêtre de choix des documents 
 */
RoundriveCreate.prototype.accept_document = function()
{
    this.item.css("display", "");
    this.folders.css("display", "none");
}

/**
 * Créer le document.
 * @returns {Promise<void>} 
 */
RoundriveCreate.prototype.create_document = function(goFunc = null)
{
    const values = {
        type:this.buttons.parent.find("button.active").data("doc"),
        folder:this.inputs.folder.val(),
        name:this.inputs.name.val(),
        model:this.inputs.models.val()
    };

    let $return = RoundriveCreate.CompletedPromise();
    let $continue = true;

    //check
    if (values.type === undefined)
    {
        mel_metapage.Functions.call('rcmail.display_message("Vous devez choisir un type de document !", "error")');
        this.item.find(".first").addClass("error");
        $continue = false;
    }
    else
        this.item.find(".first").removeClass("error");

    if (values.name === "")
    {
        mel_metapage.Functions.call('rcmail.display_message("Vous devez entrer un nom !", "error")');
        this.inputs.name.addClass("error");
        $continue = false;
    }
    else
        this.inputs.name.removeClass("error");

        if (values.folder === "") values.folder = rcmail.gettext("files", "roundrive");

    const fullpath = `${values.folder}/${values.name}`;
    if (fullpath.length >= 255) {
        console.error('La taille du chemin dépasse 255 char !', fullpath);
        mel_metapage.Functions.call('rcmail.display_message("Impossible de mettre le fichier ici !", "error")');
        this.inputs.name.addClass("error");
        $continue = false;
    }

    if ($continue)
    {
        mel_metapage.Functions.call("create_popUp.editTitle('')");
        this.item.html("<center><span class=spinner-border></span></center>")
        $return = mel_metapage.Functions.post(
            mel_metapage.Functions.url("roundrive", "create_file"),
            {
                _type:values.type,
                _name:values.name,
                _folder:values.folder,
                _model:values.model
            },
            (datas) => {
                datas = JSON.parse(datas);

                //console.log("created",datas);
                
                if (datas.success)
                {
                    if (window.Nextcloud !== undefined)
                    {
                        // mel_metapage.Functions.stockage.go({
                        //     file:datas.file,
                        //     folder:datas.path
                        // }, false, async (error) => {
                        //     create_popUp.close(); 
                        //     create_popUp = undefined;
                        //     if (!error)
                        //     {
                        //         console.error("Impossible d'ouvrir le fichier");
                        //         mel_metapage.Functions.busy(false);
                        //         await mel_metapage.Functions.change_frame("stockage", true, true);
                        //         rcmail.display_message("Impossible d'ouvrir le fichier.", "error");
                        //     }
                        // });
                        mel_metapage.Functions.stockage.go({
                            path:datas.path,
                            name:datas.file
                        }, goFunc, async (error) => {
                                create_popUp.close(); 
                                create_popUp = undefined;
                                // if (!error)
                                // {
                                //     console.error("Impossible d'ouvrir le fichier", error);
                                //     mel_metapage.Functions.busy(false);
                                //     await mel_metapage.Functions.change_frame("stockage", true, true);
                                //     rcmail.display_message("Impossible d'ouvrir le fichier.", "error");
                                // }
                            });
                    }
                }
                else
                {
                    mel_metapage.Functions.call("create_popUp.close(); create_popUp = undefined");
                    mel_metapage.Functions.call(`rcmail.display_message("${datas.error}", "error")`);
                }

            }
        )
    }

    return $return;
}

/**
 * Retourne une promesse terminée.
 * @returns {Promise<void>} Promesse terminée.
 */
RoundriveCreate.CompletedPromise = function ()
{
    return new Promise((a, b) => {});
}

RoundriveCreate.chevrons = {
    right:"icon-mel-chevron-right",
    down:"icon-mel-chevron-down",
    none:"icon-mel-minus-roundless",
    loading:"icon-mel-last-frame",
};

/**
 * Affiche les dossiers fils
 * @param {DomElement} event 
 */
RoundriveCreate.expand_folder = function(event)
{
    var returns = RoundriveCreate.CompletedPromise();

    let elements = {
        raw:event,
        querry:$(event),
        chevron:$($(event).find(".mel-clickable")[0]),
        text:$(event).find(".mel-text"),
        path:$(event).data("path").replace("¤¤¤", '"')
    };

    if (elements.chevron.length > 0)
    {
        const chevron = RoundriveCreate.chevrons

        if (elements.querry.find("ul").length > 0)
        {
            elements.chevron.removeClass(chevron.right).addClass(chevron.down);
            $(elements.querry.find("ul")[0]).css("display", "");
        }
        else
        {
            elements.chevron.removeClass(chevron.right).addClass(chevron.loading).addClass("mel-loading");

            //console.log("path", elements.path);

            returns = mel_metapage.Functions.get(
                mel_metapage.Functions.url("roundrive", "folder_list_items"),
                {
                    _folder:elements.path
                },
                (datas) => {
                    datas = JSON.parse(datas);
                    if (datas.length === 0)
                        elements.chevron.removeClass(chevron.loading).removeClass("mel-loading").addClass(chevron.none).removeClass("mel-clickable");
                    else
                    {
                        elements.chevron.removeClass(chevron.loading).removeClass("mel-loading").addClass(chevron.down);
                        let html = `<ul class="list-group list-group-flush";>`;
                        for (let index = 0; index < datas.length; ++index) {
                            const element = datas[index];
                            const path = `${rcmail.gettext("files", "roundrive")}/${decodeURIComponent(element.path)}`.replaceAll('"', "¤¤¤");
                            const length = path.split("/").length%8;
                            html += `<li data-path="${path}" class="list-group-item mel-list-item mel-item-${length}">`;
                            html += `<a href=# onclick=RoundriveCreate.folder_click(this) class="mel-not-link color-white mel-item-icon icon-mel-chevron-right mel-clickable"></a><a href=# onclick=rcmail.env.roundrive.select(this) class="mel-text mel-focus mel-not-link link-like-hover color-white">${decodeURIComponent(element.filename)}</a>`;
                            html += "</li>";
                        }
                        html += "</ul>";
                        elements.querry.append(html);
                    }

                }
            );
        }

    }

    return returns;

}

/**
 * Cache les dossiers fils
 * @param {DomElement} event 
 */
RoundriveCreate.minimize_folder = function(event)
{
    var returns = RoundriveCreate.CompletedPromise();

    let elements = {
        raw:event,
        querry:$(event),
        chevron:$(event).find(".mel-clickable"),
        ul:$(event).find("ul")
    };

    const chevron = RoundriveCreate.chevrons;

    elements.chevron.removeClass(chevron.down).addClass(chevron.right);
    elements.ul.css("display", "none");

}

/**
 * Affiche ou cache les dossiers fils
 * @param {DomElement} event 
 */
RoundriveCreate.folder_click = function (event)
{
    var returns = RoundriveCreate.CompletedPromise();

    event = $(event).parent()[0];

    let elements = {
        raw:event,
        querry:$(event),
        chevron:$($(event).find(".mel-clickable")[0]),
    };

    const chevron = {
        right:"icon-mel-chevron-right",
        down:"icon-mel-chevron-down",
        none:"icon-mel-minus-roundless",
        loading:"icon-mel-last-frame",
    }

    if (elements.chevron.hasClass(chevron.right))
        returns = RoundriveCreate.expand_folder(event);
    else if (elements.chevron.hasClass(chevron.down))
        returns = RoundriveCreate.minimize_folder(event);
    
    return returns;
}

$(document).ready(() => {
    rcmail.env.roundrive = new RoundriveCreate();
})