using System;
using System.Collections.Generic;

using CB.Cache;
using CB.Entity;
using CB.Interface.Infrastructure;

namespace CB.Data
{
    /// <summary>
    /// 基本权限导航配置  by JNswins
    /// </summary>
    public class SysAuthorityService
    {
        /// <summary>
        /// 移除缓存
        /// </summary>
        protected static void RemoveCache()
        {
            CB.Cache.CBCache.GetCacheService().RemoveObject(CB.Cache.CacheKeys.SysAuthorityInfo);
        }

        /// <summary>
        /// 新增保存
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public static bool Save(SysAuthorityInfo entity)
        {
            bool yes = DatabaseProvider.GetDbProvider<ISysAuthorityService>().Save(entity);
            if (yes)
            {
                RemoveCache(); return true;
            }
            return false;
        }

        /// <summary>
        /// 更新信息
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public static bool Update(SysAuthorityInfo entity)
        {
            bool yes = DatabaseProvider.GetDbProvider<ISysAuthorityService>().Update(entity);
            if (yes)
            {
                RemoveCache(); return true;
            }
            return false;
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool Delete(int id)
        {
            bool yes = DatabaseProvider.GetDbProvider<ISysAuthorityService>().Delete(id);
            if (yes)
            {
                RemoveCache(); return true;
            }
            return false;
        }

        /// <summary>
        /// 获取详细
        /// </summary>
        /// <param name="groupId">用户组ID</param>
        /// <returns></returns>
        public static SysAuthorityInfo Get(int id)
        {
            var list = ToList();
            if (null == list || 0 >= list.Count)
                return null;

            SysAuthorityInfo entity = null;
            for (int i = list.Count - 1; i >= 0; i--)
            {
                if (id == list[i].AId)
                    entity = list[i];
            }
            return entity;
        }

        /// <summary>
        /// 所有数据列表
        /// </summary>
        /// <returns></returns>
        public static IList<SysAuthorityInfo> ToList()
        {
            var list = CB.Cache.CBCache.GetCacheService().GetObject(CB.Cache.CacheKeys.SysAuthorityInfo) as IList<SysAuthorityInfo>;
            if (null == list || 0 >= list.Count)
            {
                list = DatabaseProvider.GetDbProvider<ISysAuthorityService>().ToList();
                CB.Cache.CBCache.GetCacheService().AddObject(CB.Cache.CacheKeys.SysAuthorityInfo, list);
            }
            return list;
        }

        /// <summary>
        /// 数据列表
        /// </summary>
        /// <param name="parentId"></param>
        /// <returns></returns>
        public static IList<SysAuthorityInfo> ToList(int parentId)
        {
            var list = ToList();
            if (null == list || 0 >= list.Count)
                return null;
            IList<SysAuthorityInfo> rlist = new List<SysAuthorityInfo>();
            foreach (var item in list)
            {
                if (parentId == item.ParentId)
                    rlist.Add(item);
            }
            return rlist;
        }

        /// <summary>
        /// 查询所有数据
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public static IList<SysAuthorityInfo> ToList(SysAuthorityInfo entity)
        {
            var list = ToList();
            if (null == list || 0 >= list.Count)
                return null;
            if (null == entity)
                return list;
            IList<SysAuthorityInfo> rlist = new List<SysAuthorityInfo>();
            foreach (var item in list)
            {
                if (0 <= entity.ParentId && item.ParentId != entity.ParentId)
                    continue;
                if (0 < entity.AuthorType && item.AuthorType != entity.AuthorType)
                    continue;
                rlist.Add(item);
            }
            return rlist;
        }

        /// <summary>
        /// 翻页
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="pageSize"></param>
        /// <param name="pageIndex"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        public static IList<SysAuthorityInfo> ToPaging(SysAuthorityInfo entity, int pageSize, int pageIndex, out int recordCount)
        {
            recordCount = 0;
            var list = ToList(entity);
            if (null == list || 0 >= list.Count)
                return null;
            recordCount = list.Count;
            int end = (pageIndex - 1) * pageSize + pageSize;
            int start = pageIndex == 1 ? 0 : (pageIndex - 1) * pageSize;
            if (start > list.Count)
                return null;
            end = end > list.Count ? list.Count : end;
            IList<SysAuthorityInfo> rlist = new List<SysAuthorityInfo>();
            for (int i = start; i < end; i++)
            {
                rlist.Add(list[i]);
            }
            return rlist;
        }

        /// <summary>
        /// 获取用户组对应的权限导航;
        /// 超级管理员直接获取所有权限导航
        /// </summary>
        /// <param name="groupId">用户组ID</param>
        /// <param name="superAdmin">是否超级管理员</param>
        /// <returns></returns>
        public static IList<SysAuthorityInfo> GetUserGroupAuthorityList(int groupId, bool superAdmin)
        {
            if (superAdmin)
                return ToList();

            var authorList = DatabaseProvider.GetDbProvider<ISysGroupAuthorityService>().GetUserGroupAuthorityList(groupId);
            if (null == authorList || 0 >= authorList.Count)
                return null;

            IList<SysAuthorityInfo> rlist = new List<SysAuthorityInfo>();
            var list = ToList();
            foreach (var item in list)
            {
                if (authorList.Contains(item.AId))
                    rlist.Add(item);
            }
            return rlist;
        }

        /// <summary>
        /// 获取用户组对应的权限导航;
        /// 超级管理员直接获取所有权限导航
        /// </summary>
        /// <param name="groupId">用户组ID</param>
        /// <param name="superAdmin">是否超级管理员</param>
        /// <param name="parentId">父ID</param>
        /// <returns></returns>
        public static IList<SysAuthorityInfo> GetUserGroupAuthorityList(int groupId, bool superAdmin, int parentId)
        {
            if (superAdmin)
                return ToList(parentId);

            var authorList = DatabaseProvider.GetDbProvider<ISysGroupAuthorityService>().GetUserGroupAuthorityList(groupId);
            if (null == authorList || 0 >= authorList.Count)
                return null;

            IList<SysAuthorityInfo> rlist = new List<SysAuthorityInfo>();
            var list = ToList(parentId);
            foreach (var item in list)
            {
                if (authorList.Contains(item.AId))
                    rlist.Add(item);
            }
            return rlist;
        }

        /// <summary>
        /// 更新用户组导航权限
        /// </summary>
        /// <param name="groupId"></param>
        /// <param name="authority"></param>
        /// <returns></returns>
        public static bool UpdateUserGroupAuthority(int groupId, string authority)
        {
            return DatabaseProvider.GetDbProvider<ISysAuthorityService>().UpdateUserGroupAuthority(groupId, authority);
        }
    }
}