import * as $ from 'jquery';


quayRun.$inject = [
  '$location',
  '$rootScope',
  'Restangular',
  'UserService',
  'PlanService',
  '$http',
  '$timeout',
  'CookieService',
  'Features',
  '$anchorScroll',
  'UtilService',
  'MetaService',
  'CONFIG',
];

export default function quayRun(
  $location,
  $rootScope,
  Restangular,
  UserService,
  PlanService,
  $http,
  $timeout,
  CookieService,
  Features,
  $anchorScroll,
  UtilService,
  MetaService,
  CONFIG) {
  var defaultTitle = CONFIG['REGISTRY_TITLE'] || 'Quay Container Registry';

  // Handle session security.
  Restangular.setDefaultRequestParams(['post', 'put', 'remove', 'delete'], {'_csrf_token': (<any>window).__token || ''});

  // Handle session expiration.
  Restangular.setErrorInterceptor(function(response) {
    if (response.status == 503) {
      (<any>$('#cannotContactService')).modal({});
      return false;
    }

    if (response.status == 500) {
      window.location.href = '/500';
      return false;
    }

    if (!response.data) {
      return true;
    }

    var invalid_token = response.data['title'] == 'invalid_token' || response.data['error_type'] == 'invalid_token';
    if (response.status == 401 && invalid_token && response.data['session_required'] !== false) {
      (<any>$('#sessionexpiredModal')).modal({});
      return false;
    }

    return true;
  });

  // Check if we need to redirect based on a previously chosen plan.
  var result = PlanService.handleNotedPlan();

  // Check to see if we need to show a redirection page.
  var redirectUrl = CookieService.get('quay.redirectAfterLoad');
  CookieService.clear('quay.redirectAfterLoad');

  if (!result && redirectUrl && redirectUrl.indexOf((<any>window).location.href) == 0) {
    (<any>window).location = redirectUrl;
    return;
  }

  $rootScope.$watch('description', function(description) {
    if (!description) {
      description = 'Hosted private docker repositories. Includes full user management and history. Free for public repositories.';
    }

    // Note: We set the content of the description tag manually here rather than using Angular binding
    // because we need the <meta> tag to have a default description that is not of the form "{{ description }}",
    // we read by tools that do not properly invoke the Angular code.
    $('#descriptionTag').attr('content', description);
  });

  // Listen for scope changes and update the title and description accordingly.
  $rootScope.$watch(function() {
    var title = MetaService.getTitle($rootScope.currentPage) || defaultTitle;
    if ($rootScope.title != title) {
      $rootScope.title = title;
    }

    var description = MetaService.getDescription($rootScope.currentPage) || '';
    if ($rootScope.description != description) {
      $rootScope.description = description;
    }
  });

  $rootScope.$on('$routeChangeSuccess', function (event, current, previous) {
    $rootScope.current = current.$$route;
    $rootScope.currentPage = current;

    $rootScope.pageClass = '';

    if (!current.$$route) { return; }

    var pageClass = current.$$route.pageClass || '';
    if (typeof pageClass != 'string') {
      pageClass = pageClass(Features);
    }


    $rootScope.pageClass = pageClass;
    $rootScope.newLayout = !!current.$$route.newLayout;
    $rootScope.fixFooter = !!current.$$route.fixFooter;

    $anchorScroll();
  });

  var initallyChecked = false;
  (<any>window).__isLoading = function() {
    if (!initallyChecked) {
      initallyChecked = true;
      return true;
    }
    return $http.pendingRequests.length > 0;
  };
}