/**
 * JSON schema for the sort order option. Validates ascending or descending sort
 * direction.
 */
var orderJsonSchema = {
  description:
    'Specifies whether to sort items in ascending or descending order.',
  enum: ['asc', 'desc'],
  type: 'string',
}
/**
 * JSON schema for the custom alphabet option. Used with 'custom' sort type to
 * define character ordering.
 */
var alphabetJsonSchema = {
  description:
    "Used only when the `type` option is set to `'custom'`. Specifies the custom alphabet for sorting.",
  type: 'string',
}
/**
 * JSON schema for the locales option. Validates locale settings for
 * locale-aware string comparison.
 */
var localesJsonSchema = {
  oneOf: [
    { type: 'string' },
    {
      items: { type: 'string' },
      type: 'array',
    },
  ],
  description: 'Specifies the sorting locales.',
}
/**
 * JSON schema for the ignoreCase option. Controls case sensitivity in string
 * comparisons.
 */
var ignoreCaseJsonSchema = {
  description: 'Controls whether sorting should be case-sensitive or not.',
  type: 'boolean',
}
/**
 * JSON schema for the special characters handling option. Defines how special
 * characters are treated during sorting.
 */
var specialCharactersJsonSchema = {
  description:
    'Specifies whether to trim, remove, or keep special characters before sorting.',
  enum: ['remove', 'trim', 'keep'],
  type: 'string',
}
var matchesAstSelectorJsonSchema = {
  description:
    'Specifies an AST selector to match elements for conditional configuration.',
  type: 'string',
}
/**
 * Builds a collection of common JSON schemas used across sorting rules.
 *
 * Creates schemas for standard sorting options that are shared by multiple
 * rules. This ensures consistent validation across the plugin.
 *
 * @param options - Configuration options.
 * @param options.additionalSortProperties - Extra sort-related option schemas
 *   to add at the root level and inside fallbackSort.
 * @returns Object containing common JSON schemas for rule validation.
 */
function buildCommonJsonSchemas({
  allowedAdditionalTypeValues,
  additionalSortProperties,
} = {}) {
  return {
    fallbackSort: buildFallbackSortJsonSchema({
      additionalProperties: additionalSortProperties,
      allowedAdditionalTypeValues,
    }),
    type: buildTypeJsonSchema({
      allowedAdditionalValues: allowedAdditionalTypeValues,
    }),
    specialCharacters: specialCharactersJsonSchema,
    ignoreCase: ignoreCaseJsonSchema,
    alphabet: alphabetJsonSchema,
    locales: localesJsonSchema,
    order: orderJsonSchema,
    ...additionalSortProperties,
  }
}
/**
 * Builds JSON schema for fallback sort configuration.
 *
 * Creates a schema for the fallback sorting option that is applied when the
 * primary sort results in equality. Allows customization through additional
 * properties.
 *
 * @param options - Configuration options.
 * @param options.additionalProperties - Extra properties to include in the
 *   schema.
 * @returns JSON schema for fallback sort validation.
 */
function buildFallbackSortJsonSchema({
  allowedAdditionalTypeValues,
  additionalProperties,
}) {
  return {
    properties: {
      type: buildTypeJsonSchema({
        allowedAdditionalValues: allowedAdditionalTypeValues,
      }),
      order: orderJsonSchema,
      ...additionalProperties,
    },
    description: 'Fallback sort order.',
    additionalProperties: false,
    required: ['type'],
    type: 'object',
  }
}
/**
 * Builds JSON schema for conditional configuration blocks.
 *
 * Creates a schema for configuration that is applied only when certain
 * conditions are met. Used for context-specific sorting rules where different
 * configurations apply based on element patterns.
 *
 * @param options - Configuration options for the conditional block.
 * @param options.additionalProperties - Extra properties to include in the
 *   schema.
 * @returns JSON schema for conditional configuration validation.
 */
function buildUseConfigurationIfJsonSchema({ additionalProperties } = {}) {
  return {
    description:
      'Specifies filters to match a particular options configuration for a given element to sort.',
    properties: {
      allNamesMatchPattern: buildRegexJsonSchema(),
      ...additionalProperties,
    },
    additionalProperties: false,
    type: 'object',
  }
}
function buildTypeJsonSchema({ allowedAdditionalValues }) {
  return {
    enum: [
      'alphabetical',
      'natural',
      'line-length',
      'custom',
      'unsorted',
      'subgroup-order',
      ...(allowedAdditionalValues ?? []),
    ],
    description: 'Specifies the sorting method.',
    type: 'string',
  }
}
function buildRegexJsonSchema({ additionalProperties } = {}) {
  return {
    oneOf: [
      {
        items: buildSingleRegexJsonSchema({ additionalProperties }),
        type: 'array',
      },
      buildSingleRegexJsonSchema({ additionalProperties }),
    ],
    description: 'Regular expression.',
  }
}
function buildSingleRegexJsonSchema({ additionalProperties }) {
  return {
    oneOf: [
      {
        properties: {
          ...additionalProperties,
          pattern: {
            description: 'Regular expression pattern.',
            type: 'string',
          },
          flags: {
            description: 'Regular expression flags.',
            type: 'string',
          },
        },
        additionalProperties: false,
        required: ['pattern'],
        type: 'object',
      },
      { type: 'string' },
    ],
    description: 'Regular expression.',
  }
}
var useExperimentalDependencyDetectionJsonSchema = {
  description:
    'Enables experimental dependency detection for sorting rules that support it.',
  type: 'boolean',
}
export {
  buildCommonJsonSchemas,
  buildFallbackSortJsonSchema,
  buildRegexJsonSchema,
  buildTypeJsonSchema,
  buildUseConfigurationIfJsonSchema,
  matchesAstSelectorJsonSchema,
  orderJsonSchema,
  useExperimentalDependencyDetectionJsonSchema,
}
