const fs = require('fs');
const logger = require('winston');
const lbryApi = require('../helpers/libraries/lbryApi.js');
const config = require('config');
const walledAddress = config.get('WalletConfig.lbryAddress');
const errorHandlers = require('../helpers/libraries/errorHandlers.js');

function createPublishParams (claim, filePath, license, nsfw) {
  logger.debug(`Creating Publish Parameters for "${claim}"`);
  if (typeof nsfw === 'string') {
    nsfw = (nsfw.toLowerCase() === 'on');
  }
  const publishParams = {
    name     : claim,
    file_path: filePath,
    bid      : 0.01,
    metadata : {
      description: `${claim} published via spee.ch`,
      title      : claim,
      author     : 'spee.ch',
      language   : 'en',
      license,
      nsfw,
    },
    claim_address : walledAddress,
    change_address: walledAddress,
  };
  logger.debug('publishParams:', publishParams);
  return publishParams;
}

function deleteTemporaryFile (filePath) {
  fs.unlink(filePath, err => {
    if (err) throw err;
    logger.debug(`successfully deleted ${filePath}`);
  });
}

module.exports = {
  publish (claim, fileName, filePath, fileType, license, nsfw, socket, visitor) {
    // update the client
    socket.emit('publish-status', 'Your image is being published (this might take a second)...');
    // send to analytics
    visitor.event('Publish Route', 'Publish Request', filePath).send();
    // create the publish object
    const publishParams = createPublishParams(claim, filePath, license, nsfw);
    // get a promise to publish
    lbryApi
      .publishClaim(publishParams, fileName, fileType)
      .then(result => {
        logger.info(`Successfully published ${fileName}`);
        visitor.event('Publish Route', 'Publish Success', filePath).send();
        socket.emit('publish-complete', { name: claim, result });
      })
      .catch(error => {
        logger.error(`Error publishing ${fileName}`, error);
        visitor.event('Publish Route', 'Publish Failure', filePath).send();
        socket.emit('publish-failure', errorHandlers.handlePublishError(error));
        deleteTemporaryFile(filePath);
      });
  },
};