import dedent from 'dedent';
import debugFactory from 'debug';
import { Observable } from 'rx';
import commitGoals from './commit-goals.json';

const debug = debugFactory('fcc:utils/commit');

export { commitGoals };

export function completeCommitment$(user) {
  const {
    isFrontEndCert,
    isBackEndCert,
    isFullStackCert,
    isRespWebDesignCert,
    isFrontEndLibsCert,
    isJsAlgoDataStructCert,
    isDataVisCert,
    isApisMicroservicesCert,
    isInfosecQaCert
  } = user;

  return Observable.fromNodeCallback(user.pledge, user)().flatMap(pledge => {
    if (!pledge) {
      return Observable.just('No pledge found');
    }

    const { goal } = pledge;

    if (
      (isFrontEndCert && goal === commitGoals.frontEndCert) ||
      (isBackEndCert && goal === commitGoals.backEndCert) ||
      (isFullStackCert && goal === commitGoals.fullStackCert) ||
      (isRespWebDesignCert && goal === commitGoals.respWebDesignCert) ||
      (isFrontEndLibsCert && goal === commitGoals.frontEndLibsCert) ||
      (isJsAlgoDataStructCert && goal === commitGoals.jsAlgoDataStructCert) ||
      (isDataVisCert && goal === commitGoals.dataVisCert) ||
      (isApisMicroservicesCert && goal === commitGoals.apisMicroservicesCert) ||
      (isInfosecQaCert && goal === commitGoals.infosecQaCert)
    ) {
      debug('marking goal complete');
      pledge.isCompleted = true;
      pledge.dateEnded = new Date();
      pledge.formerUserId = pledge.userId;
      pledge.userId = null;
      return Observable.fromNodeCallback(pledge.save, pledge)();
    }
    return Observable.just(dedent`
        You have not yet reached your goal of completing the ${goal}
        Please retry when you have met the requirements.
      `);
  });
}