import { NgModule } from 'angular-ts-decorators';
import { INJECTED_CONFIG, INJECTED_FEATURES, INJECTED_ENDPOINTS } from "./constants/injected-values.constant";
import { NAME_PATTERNS } from "./constants/name-patterns.constant";
import * as Raven from "raven-js";
import * as angular from 'angular';


var quayDependencies: any[] = [
  'chieffancypants.loadingBar',
  'cfp.hotkeys',
  'angular-tour',
  'restangular',
  'angularMoment',
  'mgcrea.ngStrap',
  'ngCookies',
  'ngSanitize',
  'angular-md5',
  'pasvaz.bindonce',
  'ansiToHtml',
  'core-ui',
  'core-config-setup',
  'infinite-scroll',
  'ngTagsInput',
  'react'
];

if (INJECTED_CONFIG && (INJECTED_CONFIG.MIXPANEL_KEY ||
  INJECTED_CONFIG.MUNCHKIN_KEY ||
  INJECTED_CONFIG.GOOGLE_ANALYTICS_KEY)) {
  quayDependencies.push('angulartics');
}
if (INJECTED_CONFIG && INJECTED_CONFIG.MIXPANEL_KEY) {
  quayDependencies.push('angulartics.mixpanel');
}
if (INJECTED_CONFIG && INJECTED_CONFIG.MUNCHKIN_KEY) {
  quayDependencies.push('angulartics.marketo');
}
if (INJECTED_CONFIG && INJECTED_CONFIG.GOOGLE_ANALYTICS_KEY) {
  quayDependencies.push('angulartics.google.analytics');
}
if (INJECTED_CONFIG && INJECTED_CONFIG.RECAPTCHA_SITE_KEY) {
  quayDependencies.push('vcRecaptcha');
}


/**
 * Module for application-wide configuration.
 */
@NgModule({
  imports: quayDependencies,
  declarations: [],
  providers: []
})
export class QuayConfig {

  public config($provide: ng.auto.IProvideService,
                $injector: ng.auto.IInjectorService,
                INJECTED_CONFIG: any,
                cfpLoadingBarProvider: any,
                $tooltipProvider: any,
                $compileProvider: ng.ICompileProvider,
                RestangularProvider: any): void {
    cfpLoadingBarProvider.includeSpinner = false;

    // decorate the tooltip getter
    var tooltipFactory: any = $tooltipProvider.$get[$tooltipProvider.$get.length - 1];
    $tooltipProvider.$get[$tooltipProvider.$get.length - 1] = function($window: ng.IWindowService) {
      if ('ontouchstart' in $window) {
        var existing: any = tooltipFactory.apply(this, arguments);
        return function(element) {
          // Note: We only disable bs-tooltip's themselves. $tooltip is used for other things
          // (such as the datepicker), so we need to be specific when canceling it.
          if (element !== undefined && element.attr('bs-tooltip') == null) {
            return existing.apply(this, arguments);
          }
        };
      }

      return tooltipFactory.apply(this, arguments);
    };

    if (!INJECTED_CONFIG['DEBUG']) {
      $compileProvider.debugInfoEnabled(false);
    }

    // Configure compile provider to add additional URL prefixes to the sanitization list. We use
    // these on the Contact page.
    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|irc):/);

    // Configure the API provider.
    RestangularProvider.setBaseUrl('/api/v1/');

    // Configure analytics.
    if (INJECTED_CONFIG && INJECTED_CONFIG.MIXPANEL_KEY) {
      let $analyticsProvider: any = $injector.get('$analyticsProvider');
      $analyticsProvider.virtualPageviews(true);
    }

    // Configure sentry.
    if (INJECTED_CONFIG && INJECTED_CONFIG.SENTRY_PUBLIC_DSN) {
      $provide.decorator("$exceptionHandler", function($delegate) {
        return function(ex, cause) {
          $delegate(ex, cause);
          Raven.captureException(ex, {extra: {cause: cause}});
        };
      });
    }
  }
}


// TODO: Make injected values into services and move to NgModule.providers, as constants are not supported in Angular 2
angular
  .module(QuayConfig.name)
  .constant('NAME_PATTERNS', NAME_PATTERNS)
  .constant('INJECTED_CONFIG', INJECTED_CONFIG)
  .constant('INJECTED_FEATURES', INJECTED_FEATURES)
  .constant('INJECTED_ENDPOINTS', INJECTED_ENDPOINTS);