import { NgModule } from 'ng-metadata/core';
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";



var quayDependencies: string[] = [
  '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',
];

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: [
    provideConfig,
    {provide: 'INJECTED_CONFIG', useValue: INJECTED_CONFIG},
    {provide: 'INJECTED_FEATURES', useValue: INJECTED_FEATURES},
    {provide: 'INJECTED_ENDPOINTS', useValue: INJECTED_ENDPOINTS},
    {provide: 'NAME_PATTERNS', useValue: NAME_PATTERNS},
  ]
})
export class QuayConfigModule {

}


/**
 * Provider function for the application configuration.
 * See https://hotell.gitbooks.io/ng-metadata/content/docs/recipes/startup-logic.html
 */
provideConfig.$inject = [
  '$provide',
  '$injector',
  'cfpLoadingBarProvider',
  '$tooltipProvider',
  '$compileProvider',
  'RestangularProvider',
];
function provideConfig($provide: ng.auto.IProvideService,
                       $injector: ng.auto.IInjectorService,
                       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) {
      const 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}});
      };
    });
  }
}