import is from '@sindresorhus/is';
import {
  extractAllPackageFiles,
  extractPackageFile,
  get,
} from '../../../manager';
import { platform } from '../../../platform';
import { logger } from '../../../logger';
import {
  filterIgnoredFiles,
  getIncludedFiles,
  getMatchingFiles,
} from './file-match';
import { PackageFile } from '../../../manager/common';

export async function getManagerPackageFiles(config): Promise<PackageFile[]> {
  const { manager, enabled, includePaths, ignorePaths } = config;
  logger.trace(`getPackageFiles(${manager})`);
  if (!enabled) {
    logger.debug(`${manager} is disabled`);
    return [];
  }
  let fileList = await platform.getFileList();
  fileList = getIncludedFiles(fileList, includePaths);
  fileList = filterIgnoredFiles(fileList, ignorePaths);
  const matchedFiles = getMatchingFiles(fileList, manager, config.fileMatch);
  // istanbul ignore else
  if (is.nonEmptyArray(matchedFiles)) {
    logger.debug(
      `Matched ${
        matchedFiles.length
      } file(s) for manager ${manager}: ${matchedFiles.join(', ')}`
    );
  } else {
    return [];
  }
  // Extract package files synchronously if manager requires it
  if (get(manager, 'extractAllPackageFiles')) {
    return extractAllPackageFiles(manager, config, matchedFiles);
  }
  const packageFiles = [];
  for (const packageFile of matchedFiles) {
    const content = await platform.getFile(packageFile);
    if (content) {
      const res = await extractPackageFile(
        manager,
        content,
        packageFile,
        config
      );
      if (res) {
        for (let index = 0; index < res.deps.length; index += 1) {
          res.deps[index].depIndex = index;
        }
        packageFiles.push({
          packageFile,
          manager,
          ...res,
        });
      }
    } else {
      // istanbul ignore next
      logger.debug({ packageFile }, 'packageFile has no content');
    }
  }
  return packageFiles;
}