import content from '../content/index';
import i18n from '../i18n';
import _ from 'lodash';
import splitWhitespace from '../libs/splitWhitespace';
import planGemLimits from '../libs/planGemLimits';
import {
  NotFound,
  NotAuthorized,
  BadRequest,
} from '../libs/errors';

module.exports = function purchase (user, req = {}, analytics) {
  let type = _.get(req.params, 'type');
  let key = _.get(req.params, 'key');
  let item;
  let price;

  if (!type) {
    throw new BadRequest(i18n.t('typeRequired', req.language));
  }

  if (!key) {
    throw new BadRequest(i18n.t('keyRequired', req.language));
  }

  if (type === 'gems' && key === 'gem') {
    let convRate = planGemLimits.convRate;
    let convCap = planGemLimits.convCap;
    convCap += user.purchased.plan.consecutive.gemCapExtra;

    if (!user.purchased || !user.purchased.plan || !user.purchased.plan.customerId) {
      throw new NotAuthorized(i18n.t('mustSubscribeToPurchaseGems', req.language));
    }

    if (user.stats.gp < convRate) {
      throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language));
    }

    if (user.purchased.plan.gemsBought >= convCap) {
      throw new NotAuthorized(i18n.t('reachedGoldToGemCap', {convCap}, req.language));
    }

    user.balance += 0.25;
    user.purchased.plan.gemsBought++;
    user.stats.gp -= convRate;

    if (analytics) {
      analytics.track('purchase gems', {
        uuid: user._id,
        itemKey: key,
        acquireMethod: 'Gold',
        goldCost: convRate,
        category: 'behavior',
      });
    }

    return [
      _.pick(user, splitWhitespace('stats balance')),
      i18n.t('plusOneGem'),
    ];
  }

  let acceptedTypes = ['eggs', 'hatchingPotions', 'food', 'quests', 'gear'];
  if (acceptedTypes.indexOf(type) === -1) {
    throw new NotFound(i18n.t('notAccteptedType', req.language));
  }

  if (type === 'gear') {
    item = content.gear.flat[key];

    if (!item) {
      throw new NotFound(i18n.t('contentKeyNotFound', {type}, req.language));
    }

    if (user.items.gear.owned[key]) {
      throw new NotAuthorized(i18n.t('alreadyHave', req.language));
    }

    price = (item.twoHanded || item.gearSet === 'animal' ? 2 : 1) / 4;
  } else {
    item = content[type][key];

    if (!item) {
      throw new NotFound(i18n.t('contentKeyNotFound', {type}, req.language));
    }

    price = item.value / 4;
  }

  if (!item.canBuy(user)) {
    throw new NotAuthorized(i18n.t('messageNotAvailable', req.language));
  }

  if (!user.balance || user.balance < price) {
    throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
  }

  user.balance -= price;

  if (type === 'gear') {
    user.items.gear.owned[key] = true;
  } else {
    if (!user.items[type][key] || user.items[type][key] < 0) {
      user.items[type][key] = 0;
    }
    user.items[type][key]++;
  }

  if (analytics) {
    analytics.track('acquire item', {
      uuid: user._id,
      itemKey: key,
      itemType: 'Market',
      acquireMethod: 'Gems',
      gemCost: item.value,
      category: 'behavior',
    });
  }

  if (req.v2 === true) {
    return _.pick(user, splitWhitespace('items balance'));
  } else {
    return [
      _.pick(user, splitWhitespace('items balance')),
    ];
  }
};
