text: 'use strict';
  
  angular.module('copayApp.controllers').controller('buyGlideraController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicConfig, lodash, glideraService, popupService, profileService, ongoingProcess, walletService, platformInfo, txFormatService) {
  
    var coin = 'btc';
    var amount;
    var currency;
  
    $scope.isCordova = platformInfo.isCordova;
  
    var showErrorAndBack = function(err) {
      $scope.sendStatus = '';
      $log.error(err);
      err = err.errors ? err.errors[0].message : err || '';
      popupService.showAlert('Error', err, function() {
        $ionicHistory.goBack();
      });
    };
  
    var showError = function(err) {
      $scope.sendStatus = '';
      $log.error(err);
      err = err.errors ? err.errors[0].message : err;
      popupService.showAlert('Error', err);
    };
  
    var statusChangeHandler = function (processName, showName, isOn) {
      $log.debug('statusChangeHandler: ', processName, showName, isOn);
      if ( processName == 'buyingBitcoin' && !isOn) {
        $scope.sendStatus = 'success';
        $timeout(function() {
          $scope.$digest();
        }, 100);
      } else if (showName) {
        $scope.sendStatus = showName;
      }
    };
  
    var processPaymentInfo = function() {
      ongoingProcess.set('connectingGlidera', true);
      glideraService.init(function(err, data) {
        if (err) {
          ongoingProcess.set('connectingGlidera', false);
          showErrorAndBack(err);
          return;
        }
        $scope.token = data.token;
        var price = {};
        if ($scope.isFiat) {
          price['fiat'] = amount;
        } else {
          price['qty'] = amount;
        }
        glideraService.buyPrice($scope.token, price, function(err, buy) {
          ongoingProcess.set('connectingGlidera', false);
          if (err) {
            showErrorAndBack(err);
            return;
          }
          $scope.buyInfo = buy;
        });
      });
    };
  
    $scope.$on("$ionicView.beforeLeave", function(event, data) {
      $ionicConfig.views.swipeBackEnabled(true);
    });
  
    $scope.$on("$ionicView.enter", function(event, data) {
      $ionicConfig.views.swipeBackEnabled(false);
    });
  
    $scope.$on("$ionicView.beforeEnter", function(event, data) {
      $scope.isFiat = data.stateParams.currency != 'BTC' ? true : false;
      amount = data.stateParams.amount;
      currency = data.stateParams.currency;
  
      $scope.network = glideraService.getNetwork();
      $scope.wallets = profileService.getWallets({
        onlyComplete: true,
        network: $scope.network,
        coin: coin
      });
  
      if (lodash.isEmpty($scope.wallets)) {
        showErrorAndBack('No wallets available');
        return;
      }
      $scope.onWalletSelect($scope.wallets[0]); // Default first wallet
    });
  
    var ask2FaCode = function(mode, cb) {
      if (mode != 'NONE') {
        // SHOW PROMPT
        var title = 'Please, enter the code below';
        var message;
        if (mode == 'PIN') {
          message = 'You have enabled PIN based two-factor authentication.';
        } else if (mode == 'AUTHENTICATOR') {
          message = 'Use an authenticator app (Authy or Google Authenticator).';
        } else {
          message = 'A SMS containing a confirmation code was sent to your phone.';
        }
        popupService.showPrompt(title, message, null, function(twoFaCode) {
          if (typeof twoFaCode == 'undefined') return cb();
          return cb(twoFaCode);
        });
      } else {
        return cb();
      }
    };
  
    $scope.buyConfirm = function() {
      var message = 'Buy unifycoin for ' + amount + ' ' + currency;
      var okText = 'Confirm';
      var cancelText = 'Cancel';
      popupService.showConfirm(null, message, okText, cancelText, function(ok) {
        if (!ok) return;
        ongoingProcess.set('buyingBitcoin', true, statusChangeHandler);
        glideraService.get2faCode($scope.token, function(err, tfa) {
          if (err) {
            ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
            showError(err);
            return;
          }
          ask2FaCode(tfa.mode, function(twoFaCode) {
            if (tfa.mode != 'NONE' && lodash.isEmpty(twoFaCode)) {
              ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
              showError('No code entered');
              return;
            }
  
            walletService.getAddress($scope.wallet, false, function(err, walletAddr) {
              if (err) {
                ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
                showError(err);
                return;
              }
              var data = {
                destinationAddress: walletAddr,
                qty: $scope.buyInfo.qty,
                priceUuid: $scope.buyInfo.priceUuid,
                useCurrentPrice: false,
                ip: null
              };
              glideraService.buy($scope.token, twoFaCode, data, function(err, data) {
                ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
                if (err) return showError(err);
                $log.info(data);
              });
            });
          });
        });
      });
    };
  
    $scope.showWalletSelector = function() {
      $scope.walletSelectorTitle = 'Receive in';
      $scope.showWallets = true;
    };
  
    $scope.onWalletSelect = function(wallet) {
      $scope.wallet = wallet;
      var parsedAmount = txFormatService.parseAmount(
        coin,
        amount,
        currency);
  
      amount = parsedAmount.amount;
      currency = parsedAmount.currency;
      $scope.amountUnitStr = parsedAmount.amountUnitStr;
      processPaymentInfo();
    };
  
    $scope.goBackHome = function() {
      $scope.sendStatus = '';
      $ionicHistory.nextViewOptions({
        disableAnimate: true,
        historyRoot: true
      });
      $ionicHistory.clearHistory();
      $state.go('tabs.home').then(function() {
        $state.transitionTo('tabs.buyandsell.glidera');
      });
    };
  });
  