/*-
 * ~~~~~~licensing~~~~~~
 * entaxy-management-plugin
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
var Entaxy;
(function (Entaxy) {
    Entaxy._module.component('entaxyAssociatedProfileSelect', {
        bindings: {
            username: '<'
        },
        template:
        `
            <entaxy-select-from-enum id="{{$ctrl.formField.name}}" values="$ctrl.formField.values"
                  model="$ctrl.formField.value" readonly="$ctrl.formField.readOnly"
                  is-empty-included="true" empty-option-name="'--No Profile--'"></entaxy-select-from-enum>
        `,
        controller: EntaxyAssociatedProfileSelectController
    })
        .name;

    function EntaxyAssociatedProfileSelectController(workspace, operationsService, entaxyService, $scope) {
        'ngInject';

        let ctrl = this;
        let selectedMbeanName = workspace.getSelectedMBeanName();

        ctrl.$onInit = function() {
            entaxyService.getProfiles().then(profiles => {
                ctrl.formField = {
                    readOnly: true,
                    values: profiles.sort(Entaxy.compareBy('name')).map(profile => profile.name)
                }
            });
        }

        $scope.$watch('$ctrl.username', function (newValue, oldValue) {
            if (newValue) {
                getAssociatedProfile();
            }
        })

        function getAssociatedProfile() {
            operationsService
            .executeOperation(selectedMbeanName, { name: 'getAssociatedProfile' }, [ ctrl.username ])
            .then(profileName => {
                if (profileName === 'Empty string') {
                    ctrl.formField.value = undefined;
                    ctrl.associatedProfile = undefined;
                    ctrl.formField.readOnly = false;
                } else {
                    entaxyService.getProfiles().then(profiles => {
                        let profile = profiles.find(profile => profile.name === profileName);
                        if (profile) {
                            ctrl.formField.value = profileName;
                            ctrl.associatedProfile = profileName;
                        } else {
                            Entaxy.notificationError('Associated profile ' + profileName + ' not found');
                        }
                        ctrl.formField.readOnly = false;
                    });
                }
            });
        }

        $scope.$watch('$ctrl.formField.value', function (newValue) {
            if (newValue !== ctrl.associatedProfile) {
                ctrl.associatedProfile = newValue;
                associateProfile();
            }
        })

        function associateProfile() {
            let parameters = [ ctrl.username, ctrl.associatedProfile ];
            operationsService
            .executeOperation(selectedMbeanName, { name: 'associateProfile' }, parameters)
            .then(() => {
                Entaxy.notificationSuccess('Profile ' + ctrl.associatedProfile +
                    ' was successfully associated with user ' + ctrl.username);
            })
            .catch(error => {
                Entaxy.notificationError('An error occurred while associating profile ' + ctrl.associatedProfile +
                    ' to user ' + ctrl.username);
                Entaxy.log.error(error);
            })
        }
    }
    EntaxyAssociatedProfileSelectController.$inject = ['workspace', 'operationsService', 'entaxyService', '$scope'];

})(Entaxy || (Entaxy = {}));
