"use strict";
(function () {
    angular.module("angularApp")
        .factory("baseSvc", ["$http", "$q", function ($http, $q) {
            var baseUrl = _spPageContextInfo.webAbsoluteUrl;
            var currentUserId = _spPageContextInfo.userId;

            var getRequest = function (query) {
                var deferred = $q.defer();
                $http({
                    url: baseUrl + query,
                    method: "GET",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "content-Type": "application/json;odata=verbose"
                    }
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };

            var getRootRequest = function (query) {
                var deferred = $q.defer();
                $http({
                    url: _spPageContextInfo.siteAbsoluteUrl + query,
                    method: "GET",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "content-Type": "application/json;odata=verbose"
                    }
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };


            var getMyRequest = function (query) {
                var deferred = $q.defer();
                $http({
                    url: baseUrl + query + '&$filter=Author/Id eq ' + currentUserId,
                    method: "GET",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "content-Type": "application/json;odata=verbose"
                    }
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };

            var getByPeopleGroupFieldValue = function (query) {
                var deferred = $q.defer();
                $http({
                    url: baseUrl + query + currentUserId,
                    method: "GET",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "content-Type": "application/json;odata=verbose"
                    }
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };



            var getAssignedToUserRequest = function (listTitle) {
                var deferred = $q.defer();

                var viewXml = "<View><Query><Where><And><Eq><FieldRef Name='Status' /><Value Type='Choice'>Not Started</Value></Eq><Or><Eq><FieldRef Name='AssignedTo' /><Value Type='Integer'><UserID/></Value></Eq><Membership Type='CurrentUserGroups'><FieldRef Name='AssignedTo' /> </Membership></Or></And></Where></Query></View>";

                $http({
                    url: baseUrl + "/_api/web/lists/getbytitle('" + listTitle + "')/getitems?$select=*,WorkflowItemId,Author/Id\,Author/Title\,AssignedTo/Id\,ContentType/EditFormUrl\&$expand=ContentType",
                    method: "POST",
                    data: "{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, \"ViewXml\": \""
                        + viewXml + "\" }}",
                    headers: {
                        "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                        "Accept": "application/json; odata=verbose",
                        "content-type": "application/json; odata=verbose"
                    }
                }).success(function (result) {
                    deferred.resolve(result);
                })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });

                return deferred.promise;
            };

            var GetFilteredListByPeopleGroup = function (query, peopleGroupFieldName) {
                var deferred = $q.defer();

                var viewXml = "<View><Query><Where><Or><Eq><FieldRef Name='" + peopleGroupFieldName + "' /><Value Type='Integer'><UserID/></Value></Eq><Membership Type='CurrentUserGroups'><FieldRef Name='" + peopleGroupFieldName + "' /></Membership></Or></Where></Query></View>";

                $http({
                    url: query,
                    method: "POST",
                    data: "{ 'query' : {'__metadata': { 'type': 'SP.CamlQuery' }, \"ViewXml\": \""
                        + viewXml + "\" }}",
                    headers: {
                        "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                        "Accept": "application/json; odata=verbose",
                        "content-type": "application/json; odata=verbose"
                    }
                }).success(function (result) {
                    deferred.resolve(result);
                })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };

            //To get the formdigestvalue, which is required to insert data to sharepoint
            //Define the service call
            var getFormDigest = function () {

                var deferred = $q.defer();
                $http({
                    url: baseUrl + "/_api/contextinfo&#8221;",
                    method: "POST",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                        "content-Type": "text/xml"
                    },
                    data: ''
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            }

            var postRequest = function (data, url) {
                var deferred = $q.defer();
                $http({
                    url: baseUrl + url,
                    method: "POST",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                        "content-Type": "application/json;odata=verbose"
                    },
                    data: JSON.stringify(data)
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };


            var updateRequest = function (data, url) {
                var deferred = $q.defer();
                $http({
                    url: baseUrl + url,
                    method: "PATCH",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                        "content-Type": "application/json;odata=verbose",
                        "X-Http-Method": "PATCH",
                        "If-Match": "*"
                    },
                    data: JSON.stringify(data)
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };


            var deleteRequest = function (url) {
                var deferred = $q.defer();
                $http({
                    url: baseUrl + url,
                    method: "DELETE",
                    headers: {
                        "accept": "application/json;odata=verbose",
                        "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                        "IF-MATCH": "*"
                    }
                })
                    .success(function (result) {
                        deferred.resolve(result);
                    })
                    .error(function (result, status) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            };

            var GetUserById = function (id) {
                var returnValue;
                var deferred = $q.defer();

                return $http({
                    url: baseUrl + "/_api/Web/GetUserById(" + id + ")",
                    method: "GET",
                    headers: {
                        "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                        "Accept": "application/json; odata=verbose",
                        "content-type": "application/json; odata=verbose"
                    }
                }).then(function (response) {
                    if (typeof response.data === 'object') {
                        return response.data.d.Title;
                    } else {
                        // invalid response
                        return $q.reject(response.data);
                    }

                }, function (response) {
                    // something went wrong
                    return $q.reject(response.data);
                });

            }


            return {
                getRequest: getRequest,
                getAssignedToUserRequest: getAssignedToUserRequest,
                GetFilteredListByPeopleGroup: GetFilteredListByPeopleGroup,
                getMyRequest: getMyRequest,
                getByPeopleGroupFieldValue: getByPeopleGroupFieldValue,
                postRequest: postRequest,
                updateRequest: updateRequest,
                deleteRequest: deleteRequest,
                getFormDigest: getFormDigest,
                getRootRequest: getRootRequest,
                GetUserById: GetUserById
            };
        }]);
})();