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.
      `);
    });
}