﻿"use strict";

// login controller
app.controller("memberEditController", ["$rootScope", "$scope", '$q', 'membershipCategories', 'memberEditService', 'authService', 'stateProvinces', "configDataService", "databaseRefs", 'companyRules',
    function ($rootScope, $scope, $q, membershipCategories, memberEditService, authService, stateProvinces, configService, databaseRefs, companyRules) {

        var DEFAULT_COUNTRY = 'United States';
        $scope.categories = membershipCategories;
        $scope.sendFormQueue = [];
        $scope.memberManagerEnabled = false;

        $scope.stateProvinces = stateProvinces;
        $scope.countries = Object.keys($scope.stateProvinces);
        $scope.onCountryChanged = function () {
            $scope.user.stateProvince = $scope.stateProvinces[$scope.user.country][0];
        };

        configService.getCachedConfig().then(function (results) {
            $scope.memberManagerEnabled = results.data.memberManagerEnabled;
        });
        $scope.members = [
        ];
        $scope.companies = [
        ];

        $scope.sendFormSingle = null;
        $scope.loading = false;
        $scope.currentCompanyId = null;
        $scope.currentCompany = null;
        $scope.user = null;
        $scope.editUserId = null;
        $scope.blankUser = {
            membershipCategoryName: "",
            firstName: "",
            lastName: "",
            email: "",
            secondaryEmailAddress: "",
            password: "",
            company: "",
            title: "",
            jobDescription: "",
            phoneNumber: "",
            address1: "",
            address2: "",
            userStateProvince: "",
            city: "",
            zipPostalCode: "",
            country: DEFAULT_COUNTRY,
            stateProvince: null,
            birthdate: null,
            acceptedBylaws: false,
            isPayingByCheck: false,
            hasFilledInProfile: false,
            membershipCategory: {
                name: Object.keys($scope.categories)[0],
                inputs: [
                ]
            }
        };
        $scope.profileEditorTemplatePath = window.location.pathname + "/spa-app/views/fragments/html/profileEditorFragment";
        $scope.addMemberDefaultData = {
            firstName: "",
            lastName: "",
            email: ""
        };

        $scope.showValidations = function () {
            if ($scope.signupForm.$invalid) {
                angular.forEach($scope.signupForm.$error.required, function (field) {
                    if (field.$invalid) field.$dirty = true;
                });
            }

            if ($scope.user.membershipCategory.name.trim() === "CHOOSE ONE") {
                $scope.signupForm.membershipCategoryName.$dirty = true;
                $scope.signupForm.membershipCategoryName.$error.required = true;
                $scope.signupForm.$invalid = true;

            } else {
                $scope.signupForm.membershipCategoryName.$dirty = false;
                $scope.signupForm.membershipCategoryName.$error.required = false;
            }
        };

        $scope.checkExceedingMemberLimit = function () {
            // 30 members max for Non-Record(1) and Record(2), 100 members max for Imprint Record(3)
            var currentMembersCount = $scope.members.filter(m => {
                return m.companyId == $scope.currentCompanyId &&
                    m.membershipStatus != databaseRefs.membershipStatus.Lifetime &&
                    m.membershipStatus != databaseRefs.membershipStatus.LifetimeGold;
            }).length;

            var currentCompany = $scope.companies.find(function (c) {
                return c.Id === $scope.currentCompanyId;
            });
            if ((currentCompany && currentCompany.CompanyTypeId === 3 && currentMembersCount >= 100)
                || (currentCompany && currentCompany.CompanyTypeId !== 3 && currentMembersCount >= 30)) {
                return true;
            }
            return false;
        };

        $scope.getRange = function (total) {
            return new Array(total);
        };

        $scope.addMemberModeData = null;
        $scope.deleteMemberModeData = null;

        $scope.handleAddMemberButton = function () {
            if ($scope.checkExceedingMemberLimit()) {
                toastr.error('You have reached the maximum number of members for your company.');
            } else {
                $scope.addMemberModeData = angular.copy($scope.addMemberDefaultData);
            }
        };

        $scope.loadMembers = function () {
            var d = $q.defer();
            memberEditService.getUsers().then(function (response) {
                $scope.members = response;
                d.resolve(response);
            }, function () {
                console.log("Error loading members");
                d.reject();
            });

            return d.promise;
        };

        $scope.onCompanyChanged = function () {
            var theSelect = document.getElementsByClassName('company-select')[0];
            $scope.currentCompanyId = parseInt(theSelect.value);
            console.log("changed: " + theSelect.value);
        };

        $scope.memberFilter = function (item) {
            return item.id === $scope.currentCompanyId;
        };
        $scope.memberManagerEnabled = false;
        $scope.handleAddMemberSubmit = function () {
            var data = $scope.addMemberModeData;
            $scope.addMemberModeData = null;
            data.companyId = $scope.currentCompanyId;
            $scope.loading = true;
            memberEditService.createUser(data).then(function () {
                $scope.loadMembers();
                $scope.loading = false;
            }, function () {
                $scope.loading = false;
            });
        };

        $scope.init = function () {
            var loadMembersTask = $scope.loadMembers();
            var loadCompaniesTask = $scope.loadCompanies();
            var loadUserInfoTask = $scope.getUserInfo();

            var allTasks = $q.all([loadMembersTask, loadCompaniesTask, loadUserInfoTask]);

            allTasks.then(function () {
                $scope.loading = false;
            });

        };

        $scope.updateCurrentCompany = function () {
            $scope.currentCompanyId = parseInt($('.company-select').val());
        };

        $scope.loadCompanies = function () {
            var d = $q.defer();
            memberEditService.getCompanies().then(function (response) {
                $scope.companies = response;
                if ($scope.companies.length > 0) {
                    $scope.currentCompanyId = $scope.companies[0].Id;
                    $scope.currentCompany = $scope.companies[0];
                }
                d.resolve(response);
            }, function () {
                console.log("Error loading companies");
                d.reject();
            });

            return d.promise;
        };

        $scope.editMemberHandler = function (userId) {
            $scope.editUserId = userId;
            memberEditService.getUser(userId).then(function (response) {
                $scope.user = response;
                // set default value if category unselected
                if ($scope.user.membershipCategory.name === null) {
                    $scope.user.membershipCategory = {
                        name: Object.keys($scope.categories)[0],
                        inputs: [
                        ]
                    }
                }
                $scope.user.membershipCategory.firstChange = !($scope.user.membershipCategory.name !== null && $scope.user.membershipCategory.name !== '' && $scope.user.membershipCategory.name !== ' CHOOSE ONE');
                
            }, function () {
                $scope.editUserId = null;
            });
        };

        $scope.deleteMemberHandler = function (id) {
            $scope.deleteMemberModeData = $scope.members.filter(function (i) { return i.id === id; })[0];
        };

        $scope.handleReallyDeleteMemberSubmit = function (id) {
            var d = $q.defer();
            memberEditService.removeUser(id).then(function (response) {
                d.resolve(response);
                $scope.loadMembers();
                $scope.deleteMemberModeData = null;
            }, function () {
                console.log("Error deleting member");
                d.reject();
                $scope.deleteMemberModeData = null;
            });

            return d.promise;
        };

        $scope.handleCancelDelete = function () {
            $scope.deleteMemberModeData = null;
        };

        $scope.handleCancelAddMember = function () {
            $scope.addMemberModeData = null;
        };

        $scope.enabledAddMemeber = function () {
            return !!$scope.addMemberModeData && /^.+@.+\..+$/g.test($scope.addMemberModeData.email);
        };

        $scope.handleAddAdminButton = function () {
            if ($scope.checkExceedingMemberLimit()) {
                toastr.error('You have reached the maximum number of members for your company.');
            } else {
                memberEditService.addAdminMember($scope.currentAdminId, $scope.currentCompanyId)
                .then(function (response) {
                    $scope.loadMembers();
                }, function (error) {
                    console.log("Error adding admin as member");
                });
            }
        };

        $scope.getUserInfo = function () {
            var d = $q.defer();
            authService.getUserInfo().then(function (results) {
                $scope.currentAdminId = results.data.id;
                d.resolve(results);
            },
                function (error) {
                    console.error('error on getUserInfo');
                    d.reject();
                });
        };

        $scope.canAddMyself = function () {
            var adminContact = $scope.members.filter(m => m.companyId == $scope.currentCompanyId).filter(function (m) {
                return m.id === $scope.currentAdminId;
            });

            return adminContact && adminContact.length === 0 ? true : false;
        };

        $scope.canPay = function () {
            var currentCompany = $scope.companies.filter(function (c) {
                return c.Id === $scope.currentCompanyId;
            })[0];

            if (!currentCompany || currentCompany.IsLocked) return false;
            var members = $scope.members.filter(function (m) {
                return m.companyId === $scope.currentCompanyId;
            });

            let companyType = Object.keys(databaseRefs.companyType).find(k => databaseRefs.companyType[k] === currentCompany.CompanyTypeId);
            let currentcompanyRules = companyRules[companyType];

            return members.length >= currentcompanyRules.min && members.every(m => m.hasFilledInProfile);
        };

        $scope.isPaidBycheque = function () {
            const cheque = 4;
            var currentCompany = $scope.companies.filter(function (c) {
                return c.Id === $scope.currentCompanyId;
            })[0];

            return currentCompany != undefined && currentCompany.Paid && currentCompany.PaymentTypeId == cheque;
        };

        $scope.isExpired = function () {
            var currentCompany = $scope.companies.filter(function (c) {
                return c.Id === $scope.currentCompanyId;
            })[0];

            return currentCompany != undefined && currentCompany.ExpiresOnUtc == null;
        }

        $scope.handlePayButton = function () {
            var currentCompany = $scope.companies.filter(function (c) {
                return c.Id === $scope.currentCompanyId;
            });

            $.awards.confirm({
                title: "Submit Roster",
                message: 'WARNING: Once you have submitted, your company roster will be locked and you will not be able to make any further changes. Do you still wish to proceed?',
                largeSize: false,
                okFunction: function () {
                    if (currentCompany.length > 0 && currentCompany[0].Paid) {
                        memberEditService.lockRoster($scope.currentCompanyId)
                            .then(function () {
                                $scope.init();
                            });
                    }
                    else {
                        window.location = '#/companyPayment/' + $scope.currentCompanyId;
                    }
                },
                okText: "OK"
            });
        };

        $scope.isCompanyUnlocked = function () {
            var currentCompany = $scope.companies.filter(function (c) {
                return c.Id === $scope.currentCompanyId;
            });

            return currentCompany && currentCompany.length > 0 && !currentCompany[0].IsLocked;
        };

        $scope.handleUpdateMember = function () {
            if (!$scope.user.hasFilledInProfile) {
                memberEditService.confirmationPaymentModal().then(function (callback) {
                    if (callback) {
                        updateUser();
                    }
                });
            } else {
                updateUser();
            }
        };

        function updateUser() {
            memberEditService.updateUser($scope.editUserId, $scope.user)
                .then(function () {
                    $scope.user = null;
                    $scope.editUserId = null;
                    $scope.loadMembers();
                }, function () {
                });
        }

        $scope.handleCancelUpdateMember = function () {
            $scope.user = null;
            $scope.editUserId = null;
        };

        $scope.onCategoryChanged = function () {
            var category = $scope.categories[$scope.user.membershipCategory.name];

            if (!$scope.user.membershipCategory.inputs) {
                $scope.user.membershipCategory.inputs = [];
            }
            angular.forEach(category.inputs, function (input, inputIndex) {
                $scope.user.membershipCategory.inputs[inputIndex] = { label: input.label, values: new Array(input.textboxes) };
            });
        };

        $scope.handleSendFormActual = function (ids) {
            var q = $q.defer();
            if ($scope.loading) {
                $.awards.notify.error("Email failed to send. Please try again or refresh the page");
                return;
            }
            $scope.loading = true;
            memberEditService.sendFormEmailToUsers(ids).then(function () {
                $scope.loading = false;
                q.resolve();
            }, function () {
                $scope.loading = false;
                q.reject();
            });

            return q.promise;
        };

        $scope.handleSendFormToAllInCompany = function () {
            $scope.sendFormQueue = $scope.members.filter(function (m) { return m.companyId == $scope.currentCompanyId; });
        }


        $scope.handleReallySendManyForms = function () {
            var batchSize = 3;
            var currentFormTask = null;
            var currentProcessing = [];

            currentProcessing = $scope.sendFormQueue.slice(0, batchSize).map(function (i) {
                return i.id;
            });
            $scope.handleSendFormActual(currentProcessing).then(function () {
                $scope.sendFormQueue.splice(0, batchSize);

                if ($scope.sendFormQueue.length > 0) {
                    $scope.handleReallySendManyForms();
                } else {
                    $.awards.notify.success("Forms sent succesfully");
                }
            }, function () {
                $.awards.notify.error("Error sending forms");
            });
        };



        $scope.handleCancelSendForms = function () {
            $scope.sendFormQueue = [];
        };

        $scope.handleSendFormButton = function (id) {
            $scope.sendFormSingle = $scope.members.filter(function (i) { return i.id == id; })[0];
        };

        $scope.handleReallySendSingleEmail = function () {
            $scope.handleSendFormActual([$scope.sendFormSingle.id]).then(function () {
                $scope.sendFormSingle = null;
                $.awards.notify.success("Form sent succesfully");

            }, function () {
                console.log("Error sending single form");
                $.awards.notify.error("Error sending single form");
            });
        };

        $scope.handleCancelSingleSendEmail = function () {
            $scope.sendFormSingle = null;
        };

        $scope.downloadInvoice = function (companyId) {
            var url = `/api/account/Invoice?id=${companyId}&contactId=${$scope.currentAdminId}`
            window.open(url, '_self');
        };

        $scope.downloadReceipt = function (companyId) {
            var url = `/api/account/Receipt?id=${companyId}&contactId=${$scope.currentAdminId}`
            window.open(url, '_self');
        };

        $scope.init();
    }]);