'use strict';

/**
 * @ngdoc service
 * @name yololiumApp.LdsAccount
 * @description
 * # LdsAccount
 * Service in the yololiumApp.
 */
angular.module('yololiumApp')
  .service('LdsAccount', [
    '$q'
  , '$http'
  , '$modal'
  , 'DaplieApiConfig'
  , 'DaplieApiRequest'
  , function LdsAccount($q, $http, $modal, DaplieApiConfig, DaplieApiRequest) {
    // AngularJS will instantiate a singleton by calling "new" on this function

    var me = this;

    /*
    function getWardClerkInfo(session, opts) {
      // TODO check to see if this user is in the system
      // if so, present them with the information to get
      // their record number from the ward clerk
      return $http.get(StApi.apiPrefix + '/ldsconnectv2/request-mrn/:emailOrPhone')q.when();
    }
    */

    me.showVerificationModal = function (account, opts) {
      return $modal.open({
        templateUrl: '/views/verify-contact-details.html'
      , controller: 'VerifyContactDetailsController as VCDC'
      , backdrop: 'static'
      , keyboard: false
      , resolve: {
          myLdsAccount: function () {
            return me;
          }
        , ldsAccountObject: function () {
            return account;
          }
        , ldsAccountOptions: function () {
            return opts;
          }
        }
      }).result;
    };

    me.showAccountModal = function (session, profile, opts) {
      return DaplieApiRequest.profile(session).then(function () {
        return $modal.open({
          templateUrl: '/views/lds-account.html'
        , controller: 'LdsAccountController as LAC'
        , backdrop: 'static'
        , keyboard: false
        , resolve: {
            realLdsAccount: function () {
              return me;
            }
          , mySession: function () {
              return session;
            }
          , myProfile: function () {
              return profile;
            }
          , myOptions: function () {
              return opts;
            }
          }
        }).result;
      });
    };

    me.verifyAccount = function (account, profile, opts) {
      var recheckTime = (3 * 30 * 24 * 60 * 60 * 1000);

      var fresh;
      
      // TODO ISO timestamps
      fresh = Date.now() - (new Date(account.userVerifiedAt).valueOf()) < recheckTime;
      if (fresh) {
        return $q.when(account);
      }

      //opts.ldsStaleLoginInfo = login;
      //return true;
      // ask the user to re-verify their info
      return me.showAccountModal(account, profile, opts).then(function () {
        return me.verifyAccount(account, profile, opts);
      });
    };

    me.getCode = function (account, type, node) {
      return $http.post(DaplieApiConfig.providerUri + '/api/ldsio/' + account.id + '/verify/code', {
        type: type
      , node: node
      }).then(function (result) {
        if (result.data.error) {
          return $q.reject(result.data.error);
        }
        return result.data;
      });
    };

    me.validateCode = function (account, type, node, uuid, code) {
      return $http.post(DaplieApiConfig.providerUri + '/api/ldsio/' + account.id + '/verify/code/validate', {
        type: type
      , node: node
      , uuid: uuid
      , code: code
      }).then(function (result) {
        if (result.data.error) {
          return $q.reject(result.data.error);
        }

        return result.data;
      });
    };

    me.isFresh = function (iso) {
      var now = Date.now();
      var date = new Date(iso).valueOf();
      // 3 months - 3 days
      var staleTime = (3 * 30 * 24 * 60 * 60 * 1000) - (3 * 24 * 60 * 60 * 1000);
      var fresh = date && (now - date < staleTime);

      return fresh;
    };

    me.ensureVerified = function (account, opts) {
      if (me.isFresh(account.emailVerifiedAt) && me.isFresh(account.phoneVerifiedAt)) {
        return $q.when();
      }

      return me.showVerificationModal(account, opts);
    };

    return me;
  }]);
