/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */

import type { Arguments, Argv } from 'yargs';

/**
 * A Yargs middleware that normalizes non Array options when the argument has been provided multiple times.
 *
 * By default, when an option is non array and it is provided multiple times in the command line, yargs
 * will not override it's value but instead it will be changed to an array unless `duplicate-arguments-array` is disabled.
 * But this option also have an effect on real array options which isn't desired.
 *
 * See: https://github.com/yargs/yargs-parser/pull/163#issuecomment-516566614
 */
export function createNormalizeOptionsMiddleware(localeYargs: Argv): (args: Arguments) => void {
  return (args: Arguments) => {
    // `getOptions` is not included in the types even though it's public API.
    // https://github.com/yargs/yargs/issues/2098
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    const { array } = (localeYargs as any).getOptions();
    const arrayOptions = new Set(array);

    for (const [key, value] of Object.entries(args)) {
      if (key !== '_' && Array.isArray(value) && !arrayOptions.has(key)) {
        const newValue = value.pop();
        // eslint-disable-next-line no-console
        console.warn(
          `Option '${key}' has been specified multiple times. The value '${newValue}' will be used.`,
        );
        args[key] = newValue;
      }
    }
  };
}
