import { dedent } from 'ts-dedent';
import deprecate from 'util-deprecate';
import glob from 'glob';
import path from 'path';

import { boost } from './interpret-files';

const warnLegacyConfigurationFiles = deprecate(
  () => {},
  dedent`
    Configuration files such as "config", "presets" and "addons" are deprecated and will be removed in Storybook 7.0.
    Read more about it in the migration guide: https://github.com/storybookjs/storybook/blob/master/MIGRATION.md#to-mainjs-configuration
  `
);

const errorMixingConfigFiles = (first: string, second: string, configDir: string) => {
  const firstPath = path.resolve(configDir, first);
  const secondPath = path.resolve(configDir, second);
  throw new Error(dedent`
    You have mixing configuration files:
    ${firstPath}
    ${secondPath}
    "${first}" and "${second}" cannot coexist.
    Please check the documentation for migration steps: https://github.com/storybookjs/storybook/blob/master/MIGRATION.md#to-mainjs-configuration
  `);
};

export function validateConfigurationFiles(configDir: string) {
  const extensionsPattern = `{${Array.from(boost).join(',')}}`;
  const exists = (file: string) =>
    !!glob.sync(path.resolve(configDir, `${file}${extensionsPattern}`)).length;

  const main = exists('main');
  const config = exists('config');

  if (!main && !config) {
    throw new Error(dedent`
      No configuration files have been found in your configDir (${path.resolve(configDir)}).
      Storybook needs either a "main" or "config" file.
    `);
  }

  if (main && config) {
    throw new Error(dedent`
      You have both a "main" and a "config". Please remove the "config" file from your configDir (${path.resolve(
        configDir,
        'config'
      )})`);
  }

  const presets = exists('presets');
  if (main && presets) {
    errorMixingConfigFiles('main', 'presets', configDir);
  }

  const preview = exists('preview');
  if (preview && config) {
    errorMixingConfigFiles('preview', 'config', configDir);
  }

  const addons = exists('addons');
  const manager = exists('manager');
  if (manager && addons) {
    errorMixingConfigFiles('manager', 'addons', configDir);
  }

  if (presets || config || addons) {
    warnLegacyConfigurationFiles();
  }
}
