﻿(function (module) {

    function eCheckPaymentController($scope, $http, $routeParams, $location, $window, eCheckService, CommonService, ConvenienceFeeService, sharedList, sharedData, $rootScope, $cookies) {
        $scope.today = new Date();

        var vm = this;
     
        vm.formData = {};
        vm.formData.Amount = $routeParams.Amount.replace(/,/g, '');
        vm.formData.AccountType = 'CHK';
        vm.formData.Authorize = false;

        vm.isSubmit = false;
        vm.isSubmitting = false;
        vm.gettingConvFee = false;
        vm.isError = false;
        vm.errorMessage = '';
        vm.RoutingNumberError = '';

        vm.Submit = Submit;
        vm.GetConvenienceFee = GetConvenienceFee;
        vm.CheckNumeric = CheckNumeric;
        vm.GotoAccountDetails = GotoAccountDetails;

        vm.listItems = sharedList.getList();
        sharedList.clearList();

        vm.cartDetails = sharedData.getList();
        sharedData.clearList();


        function Submit(isValid) {
            vm.isSubmit = true;
            vm.isSubmitting = true;

            if (isValid == false || vm.formData.Authorize == false) {
                vm.errorMessage = "Please fill missing fields.";
                vm.isSubmitting = false;
                return;
            }

            try {
                vm.formData.PaymentSystemName = GetPaymentSystemName($routeParams.Type);
                vm.formData.UseSandbox = useSandboxValue;
                vm.formData.InitiatedBy = initiatedBy;

                var firstName = vm.formData.AccountHolderName.substr(0, vm.formData.AccountHolderName.indexOf(' '));
                var lastName = vm.formData.AccountHolderName.substr(vm.formData.AccountHolderName.indexOf(' ') + 1);
                if (firstName != '') {
                    vm.formData.FirstName = firstName;
                    vm.formData.LastName = lastName;
                }
                else {
                    vm.formData.FirstName = lastName;
                    vm.formData.LastName = '';
                }

                vm.formData.ReferenceNumber = $routeParams.Reference;

                if (vm.listItems.length > 0) {
                    vm.formData.Items = vm.listItems;
                }

                if (vm.cartDetails.length > 0) {
                    vm.formData.cartDetails = vm.cartDetails;
                }
            }
            catch (err) {
                vm.isError = true;
                vm.errorMessage = "Unknown error occurred.";
                return;
            }

            try {
                eCheckService.eCheckPayment(vm.formData.PaymentSystemName, vm.formData).success(function (data, status) {
                    vm.isSubmitting = false;
                    if (data && data.Status) {
                        if (data.Status == 'APPROVED') {
                            $location.path("/eCheckReceipt/" + data.TransactionID + '/' + 'eCheck').replace();
                        } else {
                            vm.isError = true;
                            vm.formData.Authorize = false;
                            vm.errorMessage = 'Payment failed [' + status + ((data && data.Status) ? '-' + data.Status : '') + ((data && data.Message) ? '-' + data.Message : '') + ((data && data.message) ? '-' + data.message : '') + ']';
                        }
                    } else {
                        vm.isError = true;
                        vm.formData.Authorize = false;
                        vm.errorMessage = 'Payment failed [unknown response]';
                    }
                }).error(function (data, status) {
                    vm.isSubmitting = false;
                    vm.isError = true;
                    vm.formData.Authorize = false;
                    vm.errorMessage = 'Payment failed [' + status + ((data && data.Status) ? '-' + data.Status : '') + ((data && data.Message) ? '-' + data.Message : '') + ((data && data.message) ? '-' + data.message : '') + ']';
                });
            }
            catch (err) {
                vm.isSubmitting = false;
                vm.isError = true;
                vm.formData.Authorize = false;
                vm.errorMessage = 'Error processing payment [' + err.name + '-' + err.message + ']';
            }
        }

        function GetConvenienceFee() {
            try {
                vm.gettingConvFee = true;
                vm.isError = false;
                vm.errorMessage = "";

                vm.sourceData = {};
                vm.sourceData.PaymentSystemName = GetPaymentSystemName($routeParams.Type);

                ConvenienceFeeService.ConvenienceFee(vm.sourceData.PaymentSystemName, CommonService.RoundMoney(vm.formData.Amount), 'ACH', null, null, vm.formData.RoutingNumber).success(function (data, status) {
                    if (data) {
                        vm.formData.ConvFee = (data.ConvenienceFee ? data.ConvenienceFee : 0).replace(/[^\d.]+/g, '');
                        vm.formData.TotalAmount = (data.TotalAmount ? data.TotalAmount : 0).replace(/[^\d.]+/g, '');
                        vm.BankName = data.BankName ? data.BankName : '';
                        vm.gettingConvFee = false;
                        if (vm.BankName == '') {
                            vm.isError = true;
                            vm.errorMessage = 'Invalid routing number';
                            vm.RoutingNumberError = 'Routing number does not match any known banks';
                        } else {
                            vm.isError = false;
                            vm.errorMessage = '';
                            vm.RoutingNumberError = '';
                        }
                    } else {
                        vm.formData.ConvFee = 0;
                        vm.formData.TotalAmount = 0;
                        vm.BankName = '';
                        vm.gettingConvFee = false;
                        vm.isError = true;
                        vm.errorMessage = 'Unable to get convenience fee - no data [' + status + ']';
                        vm.RoutingNumberError = vm.formData.RoutingNumber ? 'Routing number does not match any known banks' : '';
                    }
                }).error(function (data, status) {
                    vm.formData.ConvFee = 0;
                    vm.formData.TotalAmount = 0;
                    vm.BankName = '';
                    vm.gettingConvFee = false;
                    vm.isError = true;
                    vm.errorMessage = 'Unable to get convenience fee [' + status + ((data && data.Status) ? '-' + data.Status : '') + ((data && data.Message) ? '-' + data.Message : '') + ((data && data.message) ? '-' + data.message : '') + ']';
                    vm.RoutingNumberError = vm.formData.RoutingNumber ? 'Routing number does not match any known banks' : '';
                });
            }
            catch (err) {
                vm.gettingConvFee = false;
                vm.isError = true;
                vm.errorMessage = 'Unable to get convenience fee [' + err.name + '-' + err.message + ']';
                vm.RoutingNumberError = vm.formData.RoutingNumber ? 'Routing number does not match any known banks' : '';
            }
        }

        function CheckNumeric(event) {
            if ((isNaN(String.fromCharCode(event.which)) && !(event.which == 8) && !(event.which == 9) && !(event.keyCode === 9)) || (event.which == 32) ) {
                event.preventDefault();
            }
        }

        function GotoAccountDetails() {
            $location.path('/AccountDetails').replace();
        }
    }

    module.controller("eCheckPaymentController", ['$scope', '$http', '$routeParams', '$location', '$window', 'eCheckService', 'CommonService', 'ConvenienceFeeService', 'sharedList', 'sharedData', '$rootScope', '$cookies', eCheckPaymentController]);

}(angular.module('app')));