webservices.factory('vatSessionService', ['$log', 'localStorageService', function ($log, localStorageService) {
    'use strict';
    $log.debug('vatSessionService.ctor()...');

    var date = new Date();
    var month = date.getMonth();
    var projectyear = date.getFullYear();
    var cacheName = 'atms-vat-cache';
    var propList = ['month', 'year', 'project', 'projects', 'dataChanged', 'logUser', 'userPermission', 'queryDto'];

    if (month <= 0) {
        month = 1;
    }
    var logUser =
        {
            ID: "66933E7B-DA75-4B2E-B7D6-AB65DCA20D50",
            UserName: "Admin",
        };

    var userPermission = {};

    var queryDto = {
        searchKeyword: '',
        fieldId: '',
        filedName: 'orgName',
        checkedOrgs: {},
    };

    var cacheObj = {
        month: month,
        userPermission: {},
        project: { year: 2017 },
        projects: [],
        dataChanged: false
    };

    //重置项目月份
    var reset = function () {
        var date = new Date();
        var m = date.getMonth();
        if (m <= 0) {
            m = 1;
        }
        this.month = m;
        setProperty("month", m);
    };

    var temp = localStorageService.get(cacheName);
    if (temp) {
        cacheObj = temp;
    } else {
        localStorageService.set(cacheName, cacheObj);
    };

    //设置属性值
    var setProperty = function (propertyName, propertyValue) {

        cacheObj[propertyName] = propertyValue;
        localStorageService.set(cacheName, cacheObj);
    };

    //获取属性值
    var getProperty = function (propertyName) {

        return cacheObj[propertyName];
    };

    // 更新project内属性
    var updateObjectProperty = function (objectName, propertyPath, propertyValue) {
        var obj = cacheObj[objectName];
        if (!_.isEmpty(obj)) {
            var propertyArr = propertyPath.split('.');
            for (var i = 0; i < propertyArr.length - 1; i++) {
                if (!_.isEmpty(obj)) {
                    obj = obj[propertyArr[i]];
                }
            }

            if (!_.isEmpty(obj)) {
                obj[propertyArr[propertyArr.length - 1]] = propertyValue;
            }
        }

        localStorageService.set(cacheName, cacheObj);
    };

    // 跳转到admin或者outputinvoice management 需要清空所选择的project,不然会影响权限
    var clearSelectProject = function () {
        var tempProject = { year: 2017 };

        setProperty('project', tempProject);
    };

    var result = {};

    var defineProp = function (propertyName) {
        Object.defineProperty(result, propertyName, {
            get: function () {

                var getValue = getProperty(propertyName);
                var year = new Date().getFullYear();
                var month = new Date().getMonth();

                switch (propertyName) {
                    case "year":
                        return getValue || year;
                    case "month":
                        return getValue || month - 1;
                    case "project":
                        return getValue || { year: year };
                    case "projects":
                        return getValue || [];
                    case "dataChanged":
                        return getValue || false;
                    case "logUser":
                        return getValue || logUser;
                    case "userPermission":
                        return getValue || {};
                    case "queryDto":
                        return getValue || queryDto;
                }
            },
            set: function (val) {
                setProperty(propertyName, val);
            },
        });
    };

    propList.forEach(function (propName) {
        defineProp(propName);
    });

    result.reset = reset;
    result.setProperty = setProperty;
    result.getProperty = getProperty;
    result.updateObjectProperty = updateObjectProperty;
    result.clearSelectProject = clearSelectProject;

    return result;
}]);

webservices.factory('citSessionService', ['$log', 'localStorageService', 'enums', function ($log, localStorageService, enums) {
    'use strict';
    $log.debug('citSessionService.ctor()...');

    var date = new Date();
    var month = constant.WholeYearPeriod;
    var projectyear = 2017;
    var cacheName = 'atms-cit-cache';
    var propList = ['month', 'year', 'project', 'projects', 'dataChanged', 'logUser', 'userPermission', 'queryDto'];
    var logUser = {
        ID: "66933E7B-DA75-4B2E-B7D6-AB65DCA20D50",
        UserName: "Admin",
    };

    var queryDto = {
        searchKeyword: '',
        fieldId: '',
        filedName: 'orgName',
        checkedOrgs: {},
    };

    var cacheObj = {
        month: month,
        userPermission: {},
        project: { year: projectyear },
        projects: [],
        dataChanged: false
    };

    var temp = localStorageService.get(cacheName);
    if (temp) {
        cacheObj = temp;
    } else {
        localStorageService.set(cacheName, cacheObj);
    };

    //设置属性值
    var setProperty = function (propertyName, propertyValue) {

        cacheObj[propertyName] = propertyValue;
        localStorageService.set(cacheName, cacheObj);
    };

    //获取属性值
    var getProperty = function (propertyName) {

        return cacheObj[propertyName];
    };

    // 更新project内属性
    var updateObjectProperty = function (objectName, propertyPath, propertyValue) {
        var obj = cacheObj[objectName];
        if (obj) {
            var propertyArr = propertyPath.split('.');
            for (var i = 0; i < propertyArr.length - 1; i++) {
                if (!_.isEmpty(obj)) {
                    obj = obj[propertyArr[i]];
                }
            }
            obj[propertyArr[propertyArr.length - 1]] = propertyValue;
        }

        localStorageService.set(cacheName, cacheObj);
    };

    //跳转到admin或者outputinvoice management 需要清空所选择的project,不然会影响权限
    var clearSelectProject = function () {
        var tempProject = { year: projectyear };

        setProperty('project', tempProject);
    };

    var result = {};

    var defineProp = function (propertyName) {
        Object.defineProperty(result, propertyName, {
            get: function () {

                var getValue = getProperty(propertyName);
                var year = new Date().getFullYear();

                switch (propertyName) {
                    case "year":
                        return getValue || year;
                    case "month":
                        return getValue || enums.wholeYearPeriod.import;
                    case "project":
                        return getValue || { year: year };
                    case "projects":
                        return getValue || [];
                    case "dataChanged":
                        return getValue || false;
                    case "logUser":
                        return getValue || logUser;
                    case "userPermission":
                        return getValue || {};
                    case "queryDto":
                        return getValue || queryDto;
                }
            },
            set: function (val) {
                setProperty(propertyName, val);
            },
        });
    };

    propList.forEach(function (propName) {
        defineProp(propName);
    });

    result.setProperty = setProperty;
    result.getProperty = getProperty;
    result.updateObjectProperty = updateObjectProperty;
    result.clearSelectProject = clearSelectProject;

    return result;

}]);