import type { OpenIdConfiguration } from '../../openid-configuration';
import { POSITIVE_VALIDATION_RESULT, type RuleValidationResult } from '../rule';

const createIdentifierToCheck = (passedConfig: OpenIdConfiguration): string => {
  if (!passedConfig) {
    return '';
  }

  const { authority, clientId, scope } = passedConfig;

  return `${authority}${clientId}${scope}`;
};

const arrayHasDuplicates = (array: string[]): boolean =>
  new Set(array).size !== array.length;

export const ensureNoDuplicatedConfigsRule = (
  passedConfigs: OpenIdConfiguration[]
): RuleValidationResult => {
  const allIdentifiers = passedConfigs.map((x) => createIdentifierToCheck(x));

  const someAreNotSet = allIdentifiers.some((x) => x === '');

  if (someAreNotSet) {
    return {
      result: false,
      messages: [
        `Please make sure you add an object with a 'config' property: ....({ config }) instead of ...(config)`,
      ],
      level: 'error',
    };
  }

  const hasDuplicates = arrayHasDuplicates(allIdentifiers);

  if (hasDuplicates) {
    return {
      result: false,
      messages: [
        'You added multiple configs with the same authority, clientId and scope',
      ],
      level: 'warning',
    };
  }

  return POSITIVE_VALIDATION_RESULT;
};
