// --
// Copyright (C) 2001-2021 OTRS AG, https://otrs.com/
// Copyright (C) 2021 Znuny GmbH, https://znuny.org/
// --
// This software comes with ABSOLUTELY NO WARRANTY. For details, see
// the enclosed file COPYING for license information (GPL). If you
// did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
// --

"use strict";

var Core = Core || {};
Core.Agent = Core.Agent || {};
Core.Agent.Admin = Core.Agent.Admin || {};

/**
 * @namespace Core.Agent.Admin.GenericInterfaceInvoker
 * @memberof Core.Agent.Admin
 * @author OTRS AG
 * @description
 *      This namespace contains the special module functions for the GenericInterface invoker module.
 */
Core.Agent.Admin.GenericInterfaceInvoker = (function (TargetNS) {

    /**
     * @private
     * @name DialogData
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @member {Array}
     * @description
     *     This variable stores the parameters that are passed from the TT and contain all the data that the dialog needs.
     */
    var DialogData = [];

    /**
     * @name Init
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @description
     *      Initializes the module functions.
     */
    TargetNS.Init = function () {
        var Events = Core.Config.Get('Events'),
            $EventListParent = $('.EventList').parent(),
            ElementID, EventName, ElementSelector;

        TargetNS.WebserviceID = parseInt(Core.Config.Get('WebserviceID'), 10);
        TargetNS.Invoker = Core.Config.Get('Invoker');
        TargetNS.Action = Core.Config.Get('Action');

        $('#MappingOutboundConfigureButton').on('click', function() {
            TargetNS.Redirect('MappingOutbound');
        });

        $('#MappingInboundConfigureButton').on('click', function() {
            TargetNS.Redirect('MappingInbound');
        });

        $('.RegisterChange').on('change.RegisterChange keyup.RegisterChange', function () {
            $('.HideOnChange').hide();
            $('.ShowOnChange').show();
        });

        $('#DeleteButton').on('click', TargetNS.ShowDeleteDialog);

        $('#EventType').on('change', function (){
            Core.UI.InputFields.Deactivate($EventListParent);
            TargetNS.ToogleEventSelect($(this).val());
            Core.UI.InputFields.Activate($EventListParent);
        });

        $('#AddEvent').on('click', function (){
            TargetNS.AddEvent($('#EventType').val());
        });

        // Initialize event trigger fields.
        Core.UI.InputFields.Deactivate($EventListParent);
        TargetNS.ToogleEventSelect($('#EventType').val());
        Core.UI.InputFields.Activate($EventListParent);

        // Initialize delete action dialog event
        $.each(Events, function(){
            ElementID = 'DeleteEvent' + this;
            EventName = this;
            ElementSelector = '#DeleteEvent' + this;

            TargetNS.BindDeleteEventDialog({
                ElementID: ElementID,
                EventName: EventName,
                ElementSelector: ElementSelector
            });
        });
    };

    /**
     * @name ToogleEventSelect
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @param {String} SelectedEventType
     * @description
     *      Toggles the event list.
     */
    TargetNS.ToogleEventSelect = function (SelectedEventType) {
        $('.EventList').addClass('Hidden');
        $('#' + SelectedEventType + 'Event').removeClass('Hidden');
    };


    /**
     * @name AddEvent
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @param {String} EventType - The type of event trigger to assign to an invoker i.e ticket or article.
     * @description
     *      This function calls the AddEvent action on the server.
     */
    TargetNS.AddEvent = function (EventType) {
        var Data = {
                Action: TargetNS.Action,
                Subaction: 'AddEvent',
                NewEvent: $('#' + EventType + 'Event').val(),
                WebserviceID: TargetNS.WebserviceID,
                Invoker: TargetNS.Invoker,
                EventType: EventType
        };

        if (Data.NewEvent) {
            if ($('#Asynchronous').is(':checked')) {
                Data.Asynchronous = 1;
            }

            $('#AddEvent').prop('disabled', true);
            Core.App.InternalRedirect(Data);
        }
        else{
            Core.UI.Dialog.ShowDialog({
                Title: Core.Language.Translate("Add Event Trigger"),
                HTML: Core.Language.Translate("It is not possible to add a new event trigger because the event is not set."),
                Modal: true,
                CloseOnClickOutside: false,
                CloseOnEscape: false,
                PositionTop: '20%',
                PositionLeft: 'Center',
                Buttons: []
            });
        }

    };

    /**
     * @name ShowDeleteDialog
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @param {Object} Event - Event object of the clicked element.
     * @description
     *      This function shows a confirmation dialog with 2 buttons.
     */
    TargetNS.ShowDeleteDialog = function(Event){
        Core.UI.Dialog.ShowContentDialog(
            $('#DeleteDialogContainer'),
            Core.Language.Translate('Delete this Invoker'),
            '240px',
            'Center',
            true,
            [
                {
                    Label: Core.Language.Translate('Cancel'),
                    Type: 'Secondary',
                    Function: function () {
                        Core.UI.Dialog.CloseDialog($('#DeleteDialog'));
                    }
                },
                {
                    Label: Core.Language.Translate('Delete'),
                    Type: 'Warning',
                    Function: function () {
                        var Data = {
                            Action: TargetNS.Action,
                            Subaction: 'DeleteAction',
                            WebserviceID: TargetNS.WebserviceID,
                            Invoker: TargetNS.Invoker
                        };

                        Core.AJAX.FunctionCall(Core.Config.Get('CGIHandle'), Data, function (Response) {
                            if (!Response || !Response.Success) {
                                alert(Core.Language.Translate('An error occurred during communication.'));
                                return;
                            }

                            Core.App.InternalRedirect({
                                Action: 'AdminGenericInterfaceWebservice',
                                Subaction: 'Change',
                                WebserviceID: TargetNS.WebserviceID
                            });

                        }, 'json');

                        Core.UI.Dialog.CloseDialog($('#DeleteDialog'));
                    }
                }
            ]
        );

        Event.stopPropagation();
    };

    /**
     * @name ShowDeleteEventDialog
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @param {Object} Event - Event object of the clicked element.
     * @description
     *      This function shows a confirmation dialog with 2 buttons.
     */
    TargetNS.ShowDeleteEventDialog = function(Event){
        var LocalDialogData;

        // get global saved DialogData for this function
        LocalDialogData = DialogData[$(this).attr('id')];
        Core.UI.Dialog.ShowContentDialog(
            $('#DeleteEventDialogContainer'),
            Core.Language.Translate('Delete this Event Trigger'),
            '240px',
            'Center',
            true,
            [
                {
                    Label: Core.Language.Translate('Cancel'),
                    Type: 'Secondary',
                    Function: function () {
                        Core.UI.Dialog.CloseDialog($('#DeleteEventDialog'));
                    }
                },
                {
                    Label: Core.Language.Translate('Delete'),
                    Type: 'Warning',
                    Function: function () {
                        var Data = {
                            Action: TargetNS.Action,
                            Subaction: 'DeleteEvent',
                            WebserviceID: TargetNS.WebserviceID,
                            Invoker: TargetNS.Invoker,
                            EventName: LocalDialogData.EventName
                        };
                        Core.AJAX.FunctionCall(Core.Config.Get('CGIHandle'), Data, function (Response) {
                            if (!Response || !Response.Success) {
                                alert(Core.Language.Translate('An error occurred during communication.'));
                                return;
                            }

                            Core.App.InternalRedirect({
                                Action: Data.Action,
                                Subaction: 'Change',
                                Invoker: Data.Invoker,
                                WebserviceID: TargetNS.WebserviceID,
                                EventType: $('#EventType').val()
                            });

                        }, 'json');

                        Core.UI.Dialog.CloseDialog($('#DeleteEventDialog'));
                    }
                }
            ]
        );

        Event.stopPropagation();
        Event.preventDefault();
    };

    /**
     * @name BindDeleteEventDialog
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @param {Object} Data - A control structure that contains the jQueryObjectID, jQueryObjectSelector and the Invoker Event Trigger Name.
     * @description
     *      This function binds a "trash can" link from the invoker event triggers table to the
     *      function that opens a dialog to delete the event trigger.
     */
    TargetNS.BindDeleteEventDialog = function (Data) {
        DialogData[Data.ElementID] = Data;

        // binding a click event to the defined element
        $(DialogData[Data.ElementID].ElementSelector).on('click', TargetNS.ShowDeleteEventDialog);
    };

    /**
     * @name Redirect
     * @memberof Core.Agent.Admin.GenericInterfaceInvoker
     * @function
     * @param {String} ConfigKey
     * @description
     *      Redirects.
     */
    TargetNS.Redirect = function(ConfigKey) {
        var ConfigElement;

        // get the Config Element name, if none it will have "null" value
        ConfigElement = $('#' + ConfigKey + 'ConfigDialog').val();

        // check is config element is a valid scring
        if (ConfigElement !== null) {

            // redirect to correct url
            Core.App.InternalRedirect({
                Action: ConfigElement,
                Subaction: 'Change',
                WebserviceID: TargetNS.WebserviceID,
                Invoker: TargetNS.Invoker,
                Direction: ConfigKey
            });
        }
    };

    Core.Init.RegisterNamespace(TargetNS, 'APP_MODULE');

    return TargetNS;
}(Core.Agent.Admin.GenericInterfaceInvoker || {}));
