(function() {
  'use strict';

  const REPOS_PER_PAGE = 6;
  const CREATE_CHECKER_URL = '/plugins/checks/checkers/';
  const SCHEME_PATTERN = /^[\w-_.]*$/;

  Polymer({
    is: 'gr-create-checkers-dialog',

    properties: {
      checker: {
        type: Object,
        observer: '_checkerChanged',
      },
      _name: String,
      _scheme: String,
      _id: String,
      _uuid: {
        type: String,
        value: '',
      },
      pluginRestApi: Object,
      _url: String,
      _description: String,
      _getRepoSuggestions: {
        type: Function,
        value() {
          return this._repoSuggestions.bind(this);
        },
      },
      // The backend might support multiple repos in the future
      // which is why I decided to keep it as an array.
      _repos: {
        type: Array,
        value: [],
        notify: true,
      },
      _repositorySelected: {
        type: Boolean,
        value: false,
      },
      _handleOnRemove: Function,
      _errorMsg: {
        type: String,
        value: '',
      },
      _statuses: {
        type: Array,
        value: [
          {
            text: 'ENABLED',
            value: 'ENABLED',
          },
          {
            text: 'DISABLED',
            value: 'DISABLED',
          },
        ],
        readOnly: true,
      },
      _required: {
        type: Boolean,
        value: false,
      },
      _status: String,
      _edit: {
        type: Boolean,
        value: false,
      },
      _query: String,
    },

    behaviours: [
      Gerrit.FireBehavior,
    ],
    /**
    * Fired when the cancel button is pressed.
    *
    * @event cancel
    */

    observers: [
      '_updateUUID(_scheme, _id)',
    ],

    _checkerChanged() {
      if (!this.checker) {
        console.warn('checker not set');
        return;
      }
      this._edit = true;
      this._scheme = this.checker.uuid.split(':')[0];
      this._id = this.checker.uuid.split(':')[1];
      this._name = this.checker.name;
      this._description = this.checker.description || '';
      this._url = this.checker.url || '';
      this._query = this.checker.query || '';
      this._required = this.checker.blocking &&
                        this.checker.blocking.length > 0;
      if (this.checker.repository) {
        this._repositorySelected = true;
        this.set('_repos', [{name: this.checker.repository}]);
      }
      this._status = this.checker.status;
    },

    _updateUUID(_scheme, _id) {
      this._uuid = _scheme + ':' + _id;
    },

    _handleStatusChange(e) {
      this._status = e.detail.value;
    },

    _validateRequest() {
      if (!this._name) {
        this._errorMsg = 'Name cannot be empty';
        return false;
      }
      if (this._description && this._description.length > 1000) {
        this._errorMsg = 'Description should be less than 1000 characters';
        return false;
      }
      if (!this._repositorySelected) {
        this._errorMsg = 'Select a repository';
        return false;
      }
      if (!this._scheme) {
        this._errorMsg = 'Scheme cannot be empty.';
        return false;
      }
      if (this._scheme.match(SCHEME_PATTERN) == null) {
        this._errorMsg =
          'Scheme must contain [A-Z], [a-z], [0-9] or {"-" , "_" , "."}';
        return false;
      }
      if (this._scheme.length > 100) {
        this._errorMsg = 'Scheme must be shorter than 100 characters';
        return false;
      }
      if (!this._id) {
        this._errorMsg = 'ID cannot be empty.';
        return false;
      }
      if (this._id.match(SCHEME_PATTERN) == null) {
        this._errorMsg =
          'ID must contain [A-Z], [a-z], [0-9] or {"-" , "_" , "."}';
        return false;
      }
      return true;
    },

    // TODO(dhruvsri): make sure dialog is scrollable.

    _createChecker(checker) {
      return this.pluginRestApi.send(
          'POST',
          CREATE_CHECKER_URL,
          checker
      );
    },

    _editChecker(checker) {
      const url = CREATE_CHECKER_URL + checker.uuid;
      return this.pluginRestApi.send(
          'POST',
          url,
          checker
      );
    },

    handleEditChecker() {
      if (!this._validateRequest()) return;
      this._editChecker(this._getCheckerRequestObject()).then(
          res => {
            if (res) {
              this._errorMsg = '';
              this.fire('cancel', {reload: true}, {bubbles: true});
            }
          },
          error => {
            this._errorMsg = error;
          }
      );
    },

    _getCheckerRequestObject() {
      return {
        name: this._name,
        description: this._description || '',
        uuid: this._uuid,
        repository: this._repos[0].name,
        url: this._url,
        status: this._status,
        blocking: this._required ? ['STATE_NOT_PASSING'] : [],
        query: this._query,
      };
    },

    handleCreateChecker() {
      if (!this._validateRequest()) return;
      // Currently after creating checker there is no reload happening (as
      // this would result in the user exiting the screen).
      this._createChecker(this._getCheckerRequestObject()).then(
          res => {
            if (res) this._cleanUp();
          },
          error => {
            this._errorMsg = error;
          }
      );
    },

    _cleanUp() {
      this._name = '';
      this._scheme = '';
      this._id = '';
      this._uuid = '';
      this._description = '';
      this._repos = [];
      this._repositorySelected = false;
      this._errorMsg = '';
      this._required = false;
      this._query = '';
      this._status = '';
      this.fire('cancel', {reload: true}, {bubbles: true});
    },

    _repoSuggestions(filter) {
      const _makeSuggestion = repo => {
        return {name: repo.name, value: repo};
      };
      return this.pluginRestApi.getRepos(filter, REPOS_PER_PAGE).then(
          repos => repos.map(repo => _makeSuggestion(repo))
      );
    },

    _handleRepositorySelected(e) {
      this.push('_repos', e.detail.value);
      this._repositorySelected = true;
    },

    _handleRequiredCheckBoxClicked() {
      this._required = !this._required;
    },

    _handleOnRemove(e) {
      const idx = this._repos.indexOf(e.detail.repo);
      if (idx == -1) return;
      this.splice('_repos', idx, 1);
      if (this._repos.length == 0) {
        this._repositorySelected = false;
      }
    },

  });
})();
