/**
 * @fileoverview Runner is the entry point of running Tsetse checks in compiler.
 */

import * as ts from 'typescript';

import * as perfTrace from '../tsc_wrapped/perf_trace';
import * as pluginApi from '../tsc_wrapped/plugin_api';

import {Checker} from './checker';
import {AbstractRule} from './rule';
import {Rule as BanExpectTruthyPromiseRule} from './rules/ban_expect_truthy_promise_rule';
import {Rule as BanPromiseAsConditionRule} from './rules/ban_promise_as_condition_rule';
import {Rule as CheckReturnValueRule} from './rules/check_return_value_rule';
import {Rule as EqualsNanRule} from './rules/equals_nan_rule';
import {Rule as MustUsePromisesRule} from './rules/must_use_promises_rule';

/**
 * List of Tsetse rules. Shared between the program plugin and the language
 * service plugin.
 */
const ENABLED_RULES: AbstractRule[] = [
  new CheckReturnValueRule(),
  new EqualsNanRule(),
  new BanExpectTruthyPromiseRule(),
  new MustUsePromisesRule(),
  new BanPromiseAsConditionRule(),
];

/**
 * The Tsetse check plugin performs compile-time static analysis for TypeScript
 * code.
 */
export class Plugin implements pluginApi.DiagnosticPlugin {
  readonly name = 'tsetse';
  private readonly checker: Checker;
  constructor(program: ts.Program, disabledTsetseRules: string[] = []) {
    this.checker = new Checker(program);
    registerRules(this.checker, disabledTsetseRules);
  }

  getDiagnostics(sourceFile: ts.SourceFile) {
    // Tsetse, in its plugin form, outputs ts.Diagnostic that don't make use
    // of the potential suggested fixes Tsetse generates. These diagnostics are
    // however displayed in context: we can therefore stringify any potential
    // suggested fixes in the error message, so they don't go to waste.
    return this.checker.execute(sourceFile)
        .map(failure => failure.toDiagnosticWithStringifiedFix());
  }
}

export function registerRules(checker: Checker, disabledTsetseRules: string[]) {
  for (const rule of ENABLED_RULES) {
    if (disabledTsetseRules.indexOf(rule.ruleName) === -1) {
      rule.register(checker);
    }
  }
}
