const path = require('path');
const fs = require('fs');
require('dotenv').config({ path: path.resolve(__dirname, '../../../.env') });
const MongoClient = require('mongodb').MongoClient;
const { getChallengesForLang } = require('@freecodecamp/curriculum');
const { flatten } = require('lodash');
const debug = require('debug');

const { createPathMigrationMap } = require('./createPathMigrationMap');

const log = debug('fcc:tools:seedChallenges');
const { MONGOHQ_URL, LOCALE: lang } = process.env;

function handleError(err, client) {
  if (err) {
    console.error('Oh noes!!');
    console.error(err);
    try {
      client.close();
    } catch (e) {
      // no-op
    } finally {
      /* eslint-disable-next-line no-process-exit */
      process.exit(1);
    }
  }
}

MongoClient.connect(
  MONGOHQ_URL,
  { useNewUrlParser: true },
  function(err, client) {
    handleError(err, client);

    log('Connected successfully to mongo');

    const db = client.db('freecodecamp');
    const challenges = db.collection('challenge');

    challenges.deleteMany({}, err => {
      handleError(err, client);

      const curriculum = getChallengesForLang(lang);

      const allChallenges = Object.keys(curriculum)
        .map(key => curriculum[key].blocks)
        .reduce((challengeArray, superBlock) => {
          const challengesForBlock = Object.keys(superBlock).map(
            key => superBlock[key].challenges
          );
          return [...challengeArray, ...flatten(challengesForBlock)];
        }, [])
        .map(challenge => {
          challenge._id = challenge.id.slice(0);
          delete challenge.id;
          return challenge;
        });

      try {
        challenges.insertMany(allChallenges, { ordered: false });
      } catch (e) {
        handleError(e, client);
      } finally {
        log('challenge seed complete');
        client.close();
        log('generating path migration map');
        const pathMap = createPathMigrationMap(curriculum);
        const outputDir = path.resolve(
          __dirname,
          '../../../api-server/server/resources/pathMigration.json'
        );
        fs.writeFile(outputDir, JSON.stringify(pathMap), err => {
          if (err) {
            console.error('Oh noes!!');
            console.error(err);
          }
          log('path migration map generated');
        });
      }
    });
  }
);