/**
 * Helper service for defining the various kinds of build triggers and retrieving information
 * about them.
 */
angular.module('quay').factory('TriggerService', ['UtilService', '$sanitize', 'KeyService', 'Features', 'CookieService',
    function(UtilService, $sanitize, KeyService, Features, CookieService) {
  var triggerService = {};

  var triggerTypes = {
    'github': {
      'description': function(config) {
        var source = UtilService.textToSafeHtml(config['build_source']);
        var desc = '<i class="fa fa-github fa-lg" style="margin-left: 2px; margin-right: 2px"></i> Push to Github Repository ';
        desc += '<a href="https://github.com/' + source  + '" target="_blank">' + source + '</a>';
        desc += '<br>Dockerfile folder: //' + UtilService.textToSafeHtml(config['subdir']);
        return desc;
      },

      'run_parameters': [
        {
          'title': 'Branch',
          'type': 'option',
          'name': 'branch_name'
        }
      ],

      'get_redirect_url': function(namespace, repository) {
        var redirect_uri = KeyService['githubRedirectUri'] + '/trigger/' +
          namespace + '/' + repository;

        // TODO(jschorr): Remove once the new layout is in place.
        if (CookieService.get('quay.exp-new-layout') == 'true') {
          redirect_uri += '/__new';
        }

        var authorize_url = KeyService['githubTriggerAuthorizeUrl'];
        var client_id = KeyService['githubTriggerClientId'];

        return authorize_url + 'client_id=' + client_id +
          '&scope=repo,user:email&redirect_uri=' + redirect_uri;
      },

      'is_enabled': function() {
        return Features.GITHUB_BUILD;
      },

      'icon': 'fa-github',

      'title': function() {
        var isEnterprise = KeyService.isEnterprise('github-trigger');
        if (isEnterprise) {
          return 'GitHub Enterprise Repository Push';
        }

        return 'GitHub Repository Push';
      }
    }
  }

  triggerService.getTypes = function() {
    var types = [];
    for (var key in triggerTypes) {
      if (!triggerTypes.hasOwnProperty(key)) {
        continue;
      }
      types.push(key);
    }
    return types;
  };

  triggerService.getRedirectUrl = function(name, namespace, repository) {
    var type = triggerTypes[name];
    if (!type) {
      return '';
    }
    return type['get_redirect_url'](namespace, repository);
  };

  triggerService.getTitle = function(name) {
    var type = triggerTypes[name];
    if (!type) {
      return 'Unknown';
    }
    return type['title']();
  };

  triggerService.getDescription = function(name, config) {
    var type = triggerTypes[name];
    if (!type) {
      return 'Unknown';
    }
    return type['description'](config);
  };

  triggerService.getMetadata = function(name) {
    return triggerTypes[name];
  };

  triggerService.getRunParameters = function(name, config) {
    var type = triggerTypes[name];
    if (!type) {
      return [];
    }
    return type['run_parameters'];
  }

  return triggerService;
}]);