/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import './note-create.css';

angular.module('zeppelinWebApp').controller('NoteCreateCtrl', NoteCreateCtrl);

function NoteCreateCtrl($scope, noteListFactory, $routeParams, websocketMsgSrv) {
  'ngInject';

  let vm = this;
  vm.clone = false;
  vm.notes = noteListFactory;
  vm.websocketMsgSrv = websocketMsgSrv;
  $scope.note = {};
  $scope.interpreterSettings = {};
  $scope.note.defaultInterpreter = null;

  vm.createNote = function() {
    if (!vm.clone) {
      let defaultInterpreterGroup = '';
      if ($scope.note.defaultInterpreter !== null) {
        defaultInterpreterGroup = $scope.note.defaultInterpreter.name;
      }
      vm.websocketMsgSrv.createNotebook($scope.note.notename, defaultInterpreterGroup);
      $scope.note.defaultInterpreter = $scope.interpreterSettings[0];
    } else {
      let noteId = $routeParams.noteId;
      vm.websocketMsgSrv.cloneNote(noteId, $scope.note.notename);
    }
  };

  vm.handleNameEnter = function() {
    angular.element('#noteCreateModal').modal('toggle');
    vm.createNote();
  };

  vm.preVisible = function(clone, sourceNoteName, path) {
    vm.clone = clone;
    vm.sourceNoteName = sourceNoteName;
    $scope.note.notename = vm.clone ? vm.cloneNoteName() : vm.newNoteName(path);
    $scope.$apply();
  };

  vm.newNoteName = function(path) {
    let newCount = 1;
    angular.forEach(vm.notes.flatList, function(noteName) {
      noteName = noteName.path;
      if (noteName.match(/^\/Untitled Note [0-9]*$/)) {
        let lastCount = noteName.substr(15) * 1;
        if (newCount <= lastCount) {
          newCount = lastCount + 1;
        }
      }
    });
    return (path ? path + '/' : '') + 'Untitled Note ' + newCount;
  };

  vm.cloneNoteName = function() {
    let copyCount = 1;
    let newCloneName = '';
    let lastIndex = vm.sourceNoteName.lastIndexOf(' ');
    let endsWithNumber = !!vm.sourceNoteName.match('^.+?\\s\\d$');
    let noteNamePrefix = endsWithNumber ? vm.sourceNoteName.substr(0, lastIndex) : vm.sourceNoteName;
    let regexp = new RegExp('^' + noteNamePrefix + ' .+');

    angular.forEach(vm.notes.flatList, function(noteName) {
      noteName = noteName.path;
      if (noteName.match(regexp)) {
        let lastCopyCount = noteName.substr(lastIndex).trim();
        newCloneName = noteNamePrefix;
        lastCopyCount = parseInt(lastCopyCount);
        if (copyCount <= lastCopyCount) {
          copyCount = lastCopyCount + 1;
        }
      }
    });

    if (!newCloneName) {
      newCloneName = vm.sourceNoteName;
    }
    return newCloneName + ' ' + copyCount;
  };

  vm.getInterpreterSettings = function() {
    vm.websocketMsgSrv.getInterpreterSettings();
  };

  $scope.$on('interpreterSettings', function(event, data) {
    $scope.interpreterSettings = data.interpreterSettings;

    // initialize default interpreter with Spark interpreter
    $scope.note.defaultInterpreter = data.interpreterSettings[0];
  });
}
