'use strict';

const validateOptions = require('./utils/validateOptions');
const { isRegExp, isString } = require('./utils/validateTypes');

/**
 * @typedef {import('stylelint').PostcssResult} PostcssResult
 * @typedef {import('stylelint').DisableOptions} DisableOptions
 * @typedef {import('stylelint').DisablePropertyName} DisablePropertyName
 * @typedef {import('stylelint').StylelintPostcssResult} StylelintPostcssResult
 */

/**
 * Validates that the stylelint config for `result` has a valid disable field
 * named `field`, and returns the result in normalized form as well as a
 * `StylelintPostcssResult` for convenience.
 *
 * Returns `null` if no disables should be reported, and automatically reports
 * an invalid configuration. If this returns non-`null`, it guarantees that
 * `result._postcssResult` is defined as well.
 *
 * @param {PostcssResult | undefined} result
 * @param {DisablePropertyName} field
 * @return {[boolean, Required<DisableOptions>, StylelintPostcssResult] | null}
 */
module.exports = function (result, field) {
	// Files with `CssSyntaxError`s don't have `_postcssResult`s.
	if (!result) return null;

	const stylelintResult = result.stylelint;

	// Files with linting errors may not have configs associated with them.
	if (!stylelintResult.config) return null;

	const rawSettings = stylelintResult.config[field];

	/** @type {boolean} */
	let enabled;
	/** @type {DisableOptions} */
	let options;

	if (Array.isArray(rawSettings)) {
		enabled = rawSettings[0];
		options = rawSettings[1] || {};
	} else {
		enabled = rawSettings || false;
		options = {};
	}

	const validOptions = validateOptions(
		result,
		field,
		{
			actual: enabled,
			possible: [true, false],
		},
		{
			actual: options,
			possible: {
				except: [isString, isRegExp],
			},
		},
	);

	if (!validOptions) return null;

	// If the check is disabled with no exceptions, there's no reason to run
	// it at all.
	if (!enabled && !options.except) return null;

	return [
		enabled,
		{
			except: options.except || [],
			severity: options.severity || stylelintResult.config.defaultSeverity || 'error',
		},
		stylelintResult,
	];
};
