# src/lib/config.js

    import fs from 'fs';
    import path from 'path';
    import findRoot from 'find-root';

    import {
      defaultUserGeneratorConfig,
      systemSeederTemplate,
      systemConfigTemplate,
      configFilename,
    } from './constants';

    /**
     * Get the user project root path
     * @return {string}
     */
    const getProjectRoot = () => {
      const workingDir = process.cwd();
      return findRoot(workingDir);
    };

    /**
     * mongoose-data-seed config
     * @type {Object}
     * @property {Function} clean
     * @property {Function} getConfigFromPackageJson
     * @property {Function} getUserGeneratorConfig
     * @property {Function} update
     * @property {Function} loadUserConfig
     * @property {String}   projectRoot
     * @property {String}   userConfigFilename
     * @property {String}   userConfigFilepath
     * @property {String}   userSeedersFolderName
     * @property {String}   userSeedersFolderPath
     * @property {boolean}  userConfigExists
     * @property {String}   seederTemplate
     * @property {String}   configTemplate
     */
    const config = {
      /**
       * Clean the config
       */
      clean() {
        delete this.workingDir;
        delete this.projectRoot;
        delete this.userConfigFilename;
        delete this.userConfigFilepath;
        delete this.userSeedersFolderName;
        delete this.userSeedersFolderPath;
        delete this.userConfigExists;
        delete this.userConfig;
        delete this.seederTemplate;
        delete this.configTemplate;
      },

      /**
       * Get the user config from the user package.json file
       * @param  {string} [projectRoot=getProjectRoot()] user project root path
       * @return {Object}
       */
      getConfigFromPackageJson(projectRoot = getProjectRoot()) {
        const packageJsonPath = path.join(projectRoot, 'package.json');
        const { mdSeed = {} } = require(packageJsonPath);

        return mdSeed;
      },

      /**
       * Get the user generator config
       * @param  {string} [projectRoot=getProjectRoot()] user project root path
       * @return {Object}
       */
      getUserGeneratorConfig(projectRoot = getProjectRoot()) {
        return {
          ...defaultUserGeneratorConfig,
          ...this.getConfigFromPackageJson(projectRoot),
        };
      },

      /**
       * Update (reload) the config
       * @param  {string} [projectRoot=getProjectRoot()] user project root path
       */
      update(projectRoot = getProjectRoot()) {
        const { seedersFolder, customSeederTemplate } = this.getUserGeneratorConfig(
          projectRoot
        );

        const userSeedersFolderName = seedersFolder;
        const userSeedersFolderPath = path.join(projectRoot, userSeedersFolderName);

        const userConfigFilename = configFilename;
        const userConfigFilepath = path.join(projectRoot, userConfigFilename);
        const userConfigExists = fs.existsSync(userConfigFilepath);

        const configTemplate = systemConfigTemplate;

        const seederTemplate = customSeederTemplate
          ? path.join(projectRoot, customSeederTemplate)
          : systemSeederTemplate;

        this.projectRoot = projectRoot;
        this.userConfigFilename = userConfigFilename;
        this.userConfigFilepath = userConfigFilepath;
        this.userSeedersFolderName = userSeedersFolderName;
        this.userSeedersFolderPath = userSeedersFolderPath;
        this.userConfigExists = userConfigExists;
        this.seederTemplate = seederTemplate;
        this.configTemplate = configTemplate;
      },

      /**
       * Load the user config
       */
      loadUserConfig() {
        return require(this.userConfigFilepath);
      },
    };

    config.update();

    export default config;