import { Linter } from '../index';

export interface Deprecated extends Linter.RulesRecord {
	/**
	 * Rule to enforce consistent indentation.
	 *
	 * @since 4.0.0-alpha.0
	 * @deprecated since 4.0.0, use [`indent`](https://eslint.org/docs/rules/indent) instead.
	 * @see https://eslint.org/docs/rules/indent-legacy
	 */
	'indent-legacy': Linter.RuleEntry<[
		number | 'tab',
		Partial<{
			/**
			 * @default 0
			 */
			SwitchCase: number;
			/**
			 * @default 1
			 */
			VariableDeclarator: Partial<{
				/**
				 * @default 1
				 */
				var: number | 'first';
				/**
				 * @default 1
				 */
				let: number | 'first';
				/**
				 * @default 1
				 */
				const: number | 'first';
			}> | number | 'first';
			/**
			 * @default 1
			 */
			outerIIFEBody: number;
			/**
			 * @default 1
			 */
			MemberExpression: number | 'off';
			/**
			 * @default { parameters: 1, body: 1 }
			 */
			FunctionDeclaration: Partial<{
				/**
				 * @default 1
				 */
				parameters: number | 'first' | 'off';
				/**
				 * @default 1
				 */
				body: number;
			}>;
			/**
			 * @default { parameters: 1, body: 1 }
			 */
			FunctionExpression: Partial<{
				/**
				 * @default 1
				 */
				parameters: number | 'first' | 'off';
				/**
				 * @default 1
				 */
				body: number;
			}>;
			/**
			 * @default { arguments: 1 }
			 */
			CallExpression: Partial<{
				/**
				 * @default 1
				 */
				arguments: number | 'first' | 'off';
			}>;
			/**
			 * @default 1
			 */
			ArrayExpression: number | 'first' | 'off';
			/**
			 * @default 1
			 */
			ObjectExpression: number | 'first' | 'off';
			/**
			 * @default 1
			 */
			ImportDeclaration: number | 'first' | 'off';
			/**
			 * @default false
			 */
			flatTernaryExpressions: boolean;
			ignoredNodes: string[];
			/**
			 * @default false
			 */
			ignoreComments: boolean;
		}>
	]>;

	/**
	 * Rule to require or disallow newlines around directives.
	 *
	 * @since 3.5.0
	 * @deprecated since 4.0.0, use [`padding-line-between-statements`](https://eslint.org/docs/rules/padding-line-between-statements) instead.
	 * @see https://eslint.org/docs/rules/lines-around-directive
	 */
	'lines-around-directive': Linter.RuleEntry<[
		'always' | 'never'
	]>;

	/**
	 * Rule to require or disallow an empty line after variable declarations.
	 *
	 * @since 0.18.0
	 * @deprecated since 4.0.0, use [`padding-line-between-statements`](https://eslint.org/docs/rules/padding-line-between-statements) instead.
	 * @see https://eslint.org/docs/rules/newline-after-var
	 */
	'newline-after-var': Linter.RuleEntry<[
		'always' | 'never'
	]>;

	/**
	 * Rule to require an empty line before `return` statements.
	 *
	 * @since 2.3.0
	 * @deprecated since 4.0.0, use [`padding-line-between-statements`](https://eslint.org/docs/rules/padding-line-between-statements) instead.
	 * @see https://eslint.org/docs/rules/newline-before-return
	 */
	'newline-before-return': Linter.RuleEntry<[]>;

	/**
	 * Rule to disallow shadowing of variables inside of `catch`.
	 *
	 * @since 0.0.9
	 * @deprecated since 5.1.0, use [`no-shadow`](https://eslint.org/docs/rules/no-shadow) instead.
	 * @see https://eslint.org/docs/rules/no-catch-shadow
	 */
	'no-catch-shadow': Linter.RuleEntry<[]>;

	/**
	 * Rule to disallow reassignment of native objects.
	 *
	 * @since 0.0.9
	 * @deprecated since 3.3.0, use [`no-global-assign`](https://eslint.org/docs/rules/no-global-assign) instead.
	 * @see https://eslint.org/docs/rules/no-native-reassign
	 */
	'no-native-reassign': Linter.RuleEntry<[
		Partial<{
			exceptions: string[];
		}>
	]>;

	/**
	 * Rule to disallow negating the left operand in `in` expressions.
	 *
	 * @since 0.1.2
	 * @deprecated since 3.3.0, use [`no-unsafe-negation`](https://eslint.org/docs/rules/no-unsafe-negation) instead.
	 * @see https://eslint.org/docs/rules/no-negated-in-lhs
	 */
	'no-negated-in-lhs': Linter.RuleEntry<[]>;

	/**
	 * Rule to disallow spacing between function identifiers and their applications.
	 *
	 * @since 0.1.2
	 * @deprecated since 3.3.0, use [`func-call-spacing`](https://eslint.org/docs/rules/func-call-spacing) instead.
	 * @see https://eslint.org/docs/rules/no-spaced-func
	 */
	'no-spaced-func': Linter.RuleEntry<[]>;

	/**
	 * Rule to suggest using `Reflect` methods where applicable.
	 *
	 * @since 1.0.0-rc-2
	 * @deprecated since 3.9.0
	 * @see https://eslint.org/docs/rules/prefer-reflect
	 */
	'prefer-reflect': Linter.RuleEntry<[
		Partial<{
			exceptions: string[];
		}>
	]>;

	/**
	 * Rule to require JSDoc comments.
	 *
	 * @since 1.4.0
	 * @deprecated since 5.10.0
	 * @see https://eslint.org/docs/rules/require-jsdoc
	 */
	'require-jsdoc': Linter.RuleEntry<[
		Partial<{
			require: Partial<{
				/**
				 * @default true
				 */
				FunctionDeclaration: boolean;
				/**
				 * @default false
				 */
				MethodDefinition: boolean;
				/**
				 * @default false
				 */
				ClassDeclaration: boolean;
				/**
				 * @default false
				 */
				ArrowFunctionExpression: boolean;
				/**
				 * @default false
				 */
				FunctionExpression: boolean;
			}>;
		}>
	]>;

	/**
	 * Rule to enforce valid JSDoc comments.
	 *
	 * @since 0.4.0
	 * @deprecated since 5.10.0
	 * @see https://eslint.org/docs/rules/valid-jsdoc
	 */
	'valid-jsdoc': Linter.RuleEntry<[
		Partial<{
			prefer: Record<string, string>;
			preferType: Record<string, string>;
			/**
			 * @default true
			 */
			requireReturn: boolean;
			/**
			 * @default true
			 */
			requireReturnType: boolean;
			/**
			 * @remarks
			 * Also accept for regular expression pattern
			 */
			matchDescription: string;
			/**
			 * @default true
			 */
			requireParamDescription: boolean;
			/**
			 * @default true
			 */
			requireReturnDescription: boolean;
			/**
			 * @default true
			 */
			requireParamType: boolean;
		}>
	]>;
}
