/* ---------------------------------------------------------------
Copyright 2020 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
------------------------------------------------------------------*/

odoo.define("cgscop_alfresco.form_widgets", function (require) {
    "use strict";

    var form_widgets = require("cmis_web.form_widgets");
    var lf_form_widgets = require("lefilament_alfodoo.form_widgets");
    var session = require("web.session");

    form_widgets.CmisObjectWrapper.include({
        /*
         * Surcharge les fonction parse_object (téléchargement)
         * et get_content_url (preview) pour passer le ticket
         * l'url appelée
         */
        parse_object: function (cmis_object) {
            this._super.apply(this, arguments);
            if (this.cmis_session.alf_ticket) {
                this.url = this.cmis_session.getContentStreamURL(
                    this.objectId,
                    "attachment",
                    {alf_ticket: this.cmis_session.alf_ticket}
                );
            }
        },
        get_content_url: function () {
            var options = {};
            if (this.cmis_session.alf_ticket) {
                options = {alf_ticket: this.cmis_session.alf_ticket};
            }
            return this.cmis_session.getContentStreamURL(
                this.objectId,
                "inline",
                options
            );
        },
    }),
        form_widgets.FieldCmisFolder.include({
            /**
             * Surcharge la fonction d'initialisation de la session CMIS pour
             * passer le token de l'utilisateur
             */
            init_cmis_session: function () {
                var self = this;
                $.when(this.cmis_config_loaded).done(function () {
                    self.cmis_session = cmis.createSession(self.cmis_location);
                    self.cmis_session.setGlobalHandlers(
                        self.on_cmis_error,
                        self.on_cmis_error
                    );

                    // CGSCOP : appel vers la fonction custom
                    self._rpc({
                        route: "/web/alfresco/session",
                        params: {
                            username: session.username,
                        },
                    }).then(function (result) {
                        self.cmis_session.alf_ticket = result;
                        self.cmis_session.setCredentials("ROLE_TICKET", result);
                    });
                    self.cmis_session_initialized.resolve();
                    self.cmis_session.setCharacterSet(document.characterSet);
                });
            },

            load_cmis_repositories: function () {
                /**
                 * Surcharge la fonction de chargement des repositories après initialisation
                 * du dossier initial pour recharger correctement la page
                 */
                var dfd = $.Deferred();
                var self = this;
                if (this.cmis_session.repositories) {
                    return dfd.resolve();
                }
                if (self.cmis_session.alf_ticket) {
                    self.cmis_session
                        .loadRepositories()
                        .ok(function (data) {
                            dfd.resolve();
                        })
                        .notOk(function (error) {
                            self.on_cmis_error(error);
                            dfd.reject(error);
                        });
                } else {
                    // CGSCOP : appel vers la fonction custom
                    self._rpc({
                        route: "/web/alfresco/session",
                        params: {
                            username: session.username,
                        },
                    }).then(function (result) {
                        self.cmis_session.alf_ticket = result;
                        self.cmis_session.setCredentials("ROLE_TICKET", result);
                        self.cmis_session
                            .loadRepositories()
                            .ok(function (data) {
                                dfd.resolve();
                            })
                            .notOk(function (error) {
                                self.on_cmis_error(error);
                                dfd.reject(error);
                            });
                    });
                }

                return dfd.promise();
            },
        });

    lf_form_widgets.CmisMetadataDialog.include({
        /*
         * Surcharge la fonction on_click_metadata
         * pour la gestion des erreurs spécifique à la CG Scop
         */
        on_click_metadata: function () {
            var self = this;
            this.metadata = {"cmis:name": Date.now().toString() + "_" + this.file.name};
            _.each(this.parent_metadata, function (meta) {
                if (meta.value) {
                    self.metadata[meta.name] = meta.value;
                } else if (meta.field_value) {
                    self.metadata[meta.name] = self.record[meta.field_value];
                } else {
                    self.metadata[meta.name] = self.$el.find(
                        "#" + meta.name.replace(":", "-")
                    )[0].value;
                }
            });
            this.cmis_session
                .createDocument(
                    this.parent_cmisobject.objectId,
                    this.file,
                    this.metadata,
                    this.file.mimeType
                )
                .ok(function (new_cmisobject) {
                    self.getParent().trigger("cmis_node_created", [new_cmisobject]);
                    self.$el.parents(".modal").modal("hide");
                })
                .notOk(function (error) {
                    console.log(error);
                    if (error) {
                        console.error(error.text);
                        if (error.type === "application/json") {
                            var jerror = JSON.parse(error.text);
                            if (jerror.exception === "objectNotFound") {
                                self.getParent().refresh_datatable();
                                self.$el.parents(".modal").modal("hide");
                                return;
                            }
                        }
                    }
                });
        },
    });
});