package org.sonar.plugins.tsql;

import org.sonar.api.Plugin;
import org.sonar.api.PropertyType;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.plugins.tsql.languages.TSQLLanguage;
import org.sonar.plugins.tsql.languages.TSQLQualityProfile;
import org.sonar.plugins.tsql.rules.definitions.CodeGuardRulesDefinition;
import org.sonar.plugins.tsql.rules.definitions.CustomPluginChecksRulesDefinition;
import org.sonar.plugins.tsql.rules.definitions.CustomUserChecksRulesDefinition;
import org.sonar.plugins.tsql.rules.definitions.MsRulesDefinition;
import org.sonar.plugins.tsql.sensors.CodeGuardIssuesLoaderSensor;
import org.sonar.plugins.tsql.sensors.CoverageSensor;
import org.sonar.plugins.tsql.sensors.CustomChecksSensor;
import org.sonar.plugins.tsql.sensors.MsIssuesLoaderSensor;

public class TSQLPlugin implements Plugin {

	@Override
	public void define(final Context context) {
		context.addExtension(PropertyDefinition.builder(Constants.CG_APP_PATH).name("SQL Code Guard path")
				.description("Path to the sql code guard exe")
				.defaultValue("C:\\Program Files (x86)\\SqlCodeGuard\\SqlCodeGuard.Cmd.exe").type(PropertyType.STRING)
				.build());

		context.addExtension(PropertyDefinition.builder(Constants.CG_REPORT_FILE).name("SQL Code Guard results file")
				.description("SQL Code Guard results file").defaultValue(Constants.CG_REPORT_FILE_DEFAULT_VALUE)
				.type(PropertyType.STRING).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SKIP_CG).name("Skip SqlCodeGuard reporting")
				.description("Flag whether to skip SqlCodeGuard reporting").defaultValue("false")
				.type(PropertyType.BOOLEAN).build());

		context.addExtension(PropertyDefinition.builder(Constants.MS_REPORT_FILE)
				.name("MSBuild SQL code analysis results file").description("MSBuild SQL code analysis results file")
				.defaultValue(Constants.MS_REPORT_FILE_DEFAULT_VALUE).type(PropertyType.STRING).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SKIP_MS).name("Skip MSBuild reporting")
				.description("Flag whether to skip MSBuild issues reporting").defaultValue("false")
				.type(PropertyType.BOOLEAN).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SKIP).name("Disable plugin")
				.description("Flag whether to disable plugin").defaultValue("false").type(PropertyType.BOOLEAN)
				.build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SKIP_CUSTOM_RULES)
				.name("Disable custom violations detection")
				.description("Flag whether to disable issues detection against custom rules").defaultValue("false")
				.type(PropertyType.BOOLEAN).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SKIP_CUSTOM).name("Skip custom reporting")
				.description("Flag whether to skip custom issues, syntax highlighting and other reporting")
				.defaultValue("false").type(PropertyType.BOOLEAN).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_MAX_FILE_SIZE)
				.name("Max file size for analysis").description("Maximum file size under analysis size")
				.defaultValue("10").type(PropertyType.INTEGER).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_CUSTOM_RULES_PATH)
				.name("Path to the custom rules path").description("A comma separated list of custom rules files/paths")
				.defaultValue("").type(PropertyType.STRING).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_CUSTOM_RULES_PREFIX)
				.name("Custom rules file name prefix").defaultValue(".customRules").type(PropertyType.STRING).build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SUFFIXES).name("Suffixes to analyze")
				.description("Suffixes supported by the plugin").defaultValue(".sql").type(PropertyType.STRING)
				.build());

		context.addExtension(PropertyDefinition.builder(Constants.PLUGIN_SKIP_COVERAGE).name("Skip coverage reporting")
				.description("Flag whether to skip SQLCover reporting").defaultValue("false").type(PropertyType.BOOLEAN)
				.build());

		context.addExtension(PropertyDefinition.builder(Constants.COVERAGE_FILE).name("Path to SQLCover file")
				.description("Absolute or relative path in base dir to SQLCover file")
				.defaultValue(Constants.COVERAGE_FILE_DEFAULT_VALUE).type(PropertyType.STRING).build());

		context.addExtensions(TSQLLanguage.class, TSQLQualityProfile.class);

		context.addExtensions(MsRulesDefinition.class, CustomPluginChecksRulesDefinition.class,
				CodeGuardRulesDefinition.class, CustomUserChecksRulesDefinition.class, MsIssuesLoaderSensor.class,
				CodeGuardIssuesLoaderSensor.class, CustomChecksSensor.class, CoverageSensor.class);

	}
}