﻿"use strict";

app.factory("memberEditService", ['$rootScope', '$http', '$q', 'configDataService', function ($rootScope, $http, $q, configDataService) {

    var memberEditServiceFactory = {};

    var _createUser = function (user) {
        var defer = $q.defer();
        var postData = {
            companyId: user.companyId,
            firstName: user.firstName,
            lastName: user.lastName,
            email: user.email
        };
        $http({
            method: 'POST',
            url: "/api/memberManagement/createNewMember/0",
            data: postData
        })
            .success(function (response) {
                defer.resolve(response);
            })
            .error(function (err) {
                defer.reject(err);
                toastr.error(err.message);
            });

        return defer.promise;
    };

    var _removeUser = function (userId) {
        var defer = $q.defer();

        $http.post("/api/memberManagement/deleteMember/" + userId)
            .success(function (response) {
                defer.resolve(response);
            })
            .error(function (err) {
                defer.reject(err);
            });

        return defer.promise;
    };

    var _getUsers = function () {
        var d = $q.defer();
        $http.get("/api/memberManagement/getMembers/0")
            .success(function (response) {
                d.resolve(response);
            })
            .error(function (err) {
                d.reject(err);
            });

        return d.promise;
    };

    var _getCompanies = function () {
        var d = $q.defer();
        $http.get("/api/memberManagement/getRelatedCompanies/0")
            .success(function (response) {
                d.resolve(response);
            })
            .error(function (err) {
                d.reject(err);
            });

        return d.promise;
    };

    var _getMember = function (memberId) {
        var d = $q.defer();
        $http.get("/api/memberManagement/getMemberDetails/" + memberId)
            .success(function (response) {

                var referenceMapper = function (responseRef) {
                    var vm = {
                        name: responseRef.Name,
                        phone: responseRef.Phone,
                        email: responseRef.Email,
                        company: responseRef.Company

                    }
                    return vm;
                };

                var result = {
                    firstName: response.FirstName,
                    lastName: response.LastName,
                    email: response.Email,
                    secondaryEmailAddress: response.SecondaryEmailAddress,
                    password: "",
                    company: response.Company,
                    title: response.Title,
                    jobDescription: response.JobDescription,
                    phoneNumber: response.PhoneNumber,
                    birthdate: response.Birthdate ? new Date(response.Birthdate) : null,
                    address1: response.Address1,
                    address2: response.Address2,
                    country: response.Country,
                    userStateProvince: response.StateProvince,
                    city: response.City,
                    zipPostalCode: response.ZipPostalCode,
                    stateProvince: response.StateProvince,
                    isPayingByCheck: response.IsPayingByCheck,
                    membershipCategory: response.MembershipCategory || {},
                    hasFilledInProfile: response.HasFilledInProfile,
                    judgeApprovalStatus: response.JudgeApprovalStatus,
                    memberReference1: referenceMapper(response.MemberReference1),
                    memberReference2: referenceMapper(response.MemberReference2)
                };
                if (response.MembershipCategory) {
                    result.membershipCategory.name = response.MembershipCategory.Name;
                    result.membershipCategory.inputs = response.MembershipCategory.Inputs.map(function (i) {
                        return {
                            label: i.Label,
                            values: i.Values
                        };
                    });
                }
                d.resolve(result);

            })
            .error(function (err) {
                d.reject(err);
            });


        return d.promise;
    };

    var _updateUser = function (userId, user) {
        var d = $q.defer();

        var memberRefBuilder = function (refer) {
            var mappedRef = {
                Name: refer.name,
                Company: refer.company,
                Email: refer.email,
                Phone: refer.phone
            };

            return mappedRef;
        };

        var postData = {
            FirstName: user.firstName,
            LastName: user.lastName,
            Email: (user.email || "").trim(),
            SecondaryEmailAddress: (user.secondaryEmailAddress || "").trim(),
            Company: user.company,
            Title: user.title,
            JobDescription: user.jobDescription,
            PhoneNumber: user.phoneNumber,
            BirthDate: user.birthdate,
            Address1: user.address1,
            Address2: user.address2,
            Country: user.country,
            StateProvince: user.userStateProvince,
            City: user.city,
            ZipPostalCode: user.zipPostalCode,
            Birthdate: user.birthdate,
            IsPayingByCheck: user.isPayingByCheck,
            MembershipCategory: user.membershipCategory,
            MemberReference1: memberRefBuilder(user.memberReference1),
            MemberReference2: memberRefBuilder(user.memberReference2)
        };

        $http.post("/api/memberManagement/updateMemberDetails/" + userId, postData)
            .success(function (response) {

                d.resolve();

            })
            .error(function (err) {
                d.reject(err);
            });


        return d.promise;
    };

    var _addAdminMember = function (contactId, companyId) {
        return $http.post("/api/memberManagement/addAdminAsMember/" + companyId, { companyId, contactId });
    };

    var _lockRoster = function (companyId) {
        return $http.post("/api/memberManagement/lockCompany/" + companyId);
    };

    var _sendFormEmailToUsers = function (ids) {
        return $http.post("/api/memberManagement/sendFormEmails/0", ids);
    };

    var _confirmationPaymentModal = function (ids) {
        var d = $q.defer();
        $.awards.confirm({
            title: "Submit Payment",
            message: 'Please note that the mobile number you have entered MUST receive SMS for you to gain access to voting. Once you click Update on this page, the mobile number you entered will be locked and you will not be able to change it. Do you wish to proceed?',
            largeSize: false,
            okFunction: function () {
                d.resolve(true);
            },
            okText: "OK"
        });
        return d.promise;
    };

    memberEditServiceFactory.createUser = _createUser;
    memberEditServiceFactory.removeUser = _removeUser;
    memberEditServiceFactory.getUsers = _getUsers;
    memberEditServiceFactory.getCompanies = _getCompanies;
    memberEditServiceFactory.getUser = _getMember;
    memberEditServiceFactory.addAdminMember = _addAdminMember;
    memberEditServiceFactory.updateUser = _updateUser;
    memberEditServiceFactory.lockRoster = _lockRoster;
    memberEditServiceFactory.sendFormEmailToUsers = _sendFormEmailToUsers;
    memberEditServiceFactory.confirmationPaymentModal = _confirmationPaymentModal;

    return memberEditServiceFactory;
}]);