const fs = require('fs');
const path = require('path');
const PATH_TO_DATA = '../../watchmoData/';
const chalk = require('chalk');


//the characters demarcating the space between different responses in the rawData file
const DEMARCATION = '*W*M*O*';

//*** HELPER FUNCTIONS ***

const dataPaths = (projectName) => ({
  projectPath: path.join(__dirname, PATH_TO_DATA, projectName),
  configPath: path.join(__dirname, PATH_TO_DATA, projectName, 'config.json'),
  rawDataPath: path.join(__dirname, PATH_TO_DATA, projectName, 'snapshots.txt'),
  parsedDataPath: path.join(__dirname, PATH_TO_DATA, projectName, 'parsedData.json'),
  templatePath: path.join(__dirname, '../templates/config.json'),
  projectNamesPath: path.join(__dirname, PATH_TO_DATA, 'projectNames.json'),
})

const checkAndParseFile = filePath => {
  if (fs.existsSync(filePath)) {
    return JSON.parse(fs.readFileSync(filePath));
  } else return {};
};


//DEMARCATION is used to demarcate new entries in the textfile
const appendRawData = (data, savePath) => {
  fs.appendFile(savePath, JSON.stringify(data) + DEMARCATION, err => {
    if (err) {
      console.log(err);
    } else {
      console.log(chalk.green.bold.underline(`DATA SAVED TO ${savePath}`));
    }
  });
}

function writeJSON(savePath, object) {
  fs.writeFile(savePath, JSON.stringify(object), err => {
    if (err) {
      console.log(err);
    } else {
      console.log(chalk.green.bold.underline(`DATA SAVED TO ${savePath}`));
    }
  });
}

function readParseWriteJSON(readPath, parser, writePath) {
  fs.readFile(readPath, 'utf-8', (err, data) => {
    if (err) {
      console.log(chalk.red.bold.underline('Error reading file', err));
    } else {
      writeJSON(writePath, parser(data));
    }
  })
}

//Higher order function for creating functions for performing a file system action on all files in a given array
const actionOnAllFiles = fileAction => (pathArray => {
  pathArray.forEach(path => {
    fileAction(path, err => {
      if (err) {
        console.log(err);
      }
    })
  })
})

const cleanAllFiles = actionOnAllFiles((path, errCb) => fs.writeFileSync(path, '', errCb));

const checkAndRemoveAllFiles = actionOnAllFiles((path, errCb) => {
  if (fs.existsSync(path)) {
    fs.unlinkSync(path, errCb);
  }
})

const removeProject = projectName => {
  const { projectPath, configPath, rawDataPath, parsedDataPath } = dataPaths(projectName);
  checkAndRemoveAllFiles([configPath, rawDataPath, parsedDataPath]);
  fs.rmdirSync(projectPath);
}




module.exports = {
  checkAndParseFile,
  appendRawData,
  dataPaths,
  removeProject,
  cleanAllFiles,
  writeJSON,
  readParseWriteJSON,
  DEMARCATION,
}