/*-
 * ~~~~~~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('entaxyEditorModal', {
        bindings: {
            modalInstance: '<',
            resolve: '<'
        },
        template:
        `
          <div class="entaxy-modal-container">
            <div class="modal-header">
              <button type="button" class="close" aria-label="Close" ng-click="$ctrl.cancel()">
                <span class="pficon pficon-close" aria-hidden="true"></span>
              </button>
              <h4 class="modal-title">{{$ctrl.modalTitle}}</h4>
            </div>
              <div class="modal-body-without-header">
                <div class="syntax-highlighting-container">
                  <label class="control-label" for="syntaxHighlighting">Syntax highlighting</label>
                  <entaxy-select-from-enum id="syntaxHighlighting"
                        values="$ctrl.selectValues" model="$ctrl.editorMode"
                        is-empty-included="false" sort-needed="true"></entaxy-select-from-enum>
                </div>
                <div class="entaxy-resource-editor-container">
                  <entaxy-editor class="entaxy-editor" mode="$ctrl.editorMode" source-doc="$ctrl.resourceContent">
                  </entaxy-editor>
                </div>
              </div>
              <div class="modal-footer">
                <div class="btn-group" uib-dropdown>
                  <button id="split-button" type="button" class="btn btn-primary" ng-click="$ctrl.save(true)">
                    Save
                  </button>
                  <button type="button" class="btn btn-primary" uib-dropdown-toggle>
                    <span class="caret"></span>
                  </button>
                  <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="split-button">
                    <li role="menuitem"><a ng-click="$ctrl.save(false)">Save as...</a></li>
                  </ul>
                </div>
              </div>
          </div>
        `,
        controller: entaxyEditorModalController
    })
        .name;

    function entaxyEditorModalController($uibModal, $scope, entaxyService, entaxyResourcesService, entaxyHotkeysService) {
        'ngInject';

        let ctrl = this;

        ctrl.$onInit = function() {
            entaxyHotkeysService.setHotkeys($scope, getHotkeysConfigs());

            let ftlType = {
                displayValue: 'ftl',
                value: 'freemarkermixed'
            };
            let jsonType = {
                displayValue: 'json',
                value: { name: 'javascript', json: true }
            };
            ctrl.selectValues = [ ftlType, jsonType, 'xml', 'yaml', 'txt' ];

            ctrl.modalTitle = 'Edit resource: ' + ctrl.resolve.resourceName;
            ctrl.resourceContent = ctrl.resolve.resourceContent;

            ctrl.editorMode = getEditorMode(ctrl.resolve.extension);
        }

        function getEditorMode(extension) {
            switch (extension) {
                case 'xml':
                case 'xsd':
                case 'xsl':
                case 'xslt':
                case 'wsdl':
                    return 'xml';
                case 'json':
                case 'ftl':
                    return ctrl.selectValues.find(value => value.displayValue === extension).value;
                case 'yaml':
                case 'txt':
                    return extension;
                default:
                    return 'txt';
            }
        }

        ctrl.cancel = function(reason) {
            ctrl.modalInstance.dismiss(reason);
        }

        ctrl.save = function(writeIntoSource) {
            if (validate()) {
                if (writeIntoSource) {
                    ctrl.modalInstance.close({
                        writeIntoSource: writeIntoSource,
                        content: ctrl.resourceContent
                    });
                } else {
                    entaxyResourcesService.openResourceNameInputModal(
                        { name: ctrl.resolve.resourceName, isFolder: false },
                        ctrl.resolve.names,
                        true,
                        false)
                    .then((name) => {
                        ctrl.modalInstance.close({
                            writeIntoSource: writeIntoSource,
                            content: ctrl.resourceContent,
                            name: name
                        });
                    });
                }
            } else {
                let message = ctrl.errors.type ? 'Content value is invalid' : 'Content value should not be empty';
                Entaxy.notificationError(message);
            }
        }

        function validate() {
            ctrl.errors = {};
            if (angular.isString(ctrl.resourceContent) && ctrl.resourceContent.trim().length > 0 &&
                    !isTypeFitContent()) {
                ctrl.errors.type = true;
            }
            return Object.keys(ctrl.errors).length == 0;
        }

        function isTypeFitContent() {
            if (ctrl.resolve.extension === 'xml') {
                return entaxyService.isSupposedlyXml(ctrl.resourceContent);
            } else if (ctrl.resolve.extension === 'json') {
                return entaxyService.isSupposedlyJson(ctrl.resourceContent);
            } else {
                return true;
            }
        }

        function getHotkeysConfigs() {
            return [
                {
                    ...Entaxy.getSaveHotkeyDescription(),
                    callback: function (event) {
                        event.preventDefault();
                        ctrl.save(true);
                    }
                },
                {
                    ...Entaxy.getSaveAsHotkeyDescription(),
                    callback: function (event) {
                        event.preventDefault();
                        ctrl.save(false);
                    }
                }
            ];
        }
    }
    entaxyEditorModalController.$inject = ['$uibModal', '$scope', 'entaxyService', 'entaxyResourcesService',
        'entaxyHotkeysService'];

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