using Ropin.Inspection.Model;
using Ropin.Inspection.Model.Entities;
using Ropin.Inspection.Model.ViewModel;
using Ropin.Inspection.Repository.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ropin.Inspection.Repository
{
    public class TsysUserRoleRepository : RepositoryBase<TSYS_UserRole, Guid>, ITsysUserRoleRepository
    {

        public TsysUserRoleRepository(InspectionDbContext dbContext) : base(dbContext)
        {

        }


        public Task<bool> DeleteByUserIdAsync(Guid userId)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("userId", userId) };
            string sql = "DELETE FROM TSYS_UserRole where C_UserCode = @userId";
            int iResult = EntityFrameworkCoreExtensions.ExecuteSqlNoQuery(DbContext.Database, sql, parameters);
            return Task.FromResult(true);
        }
        public Task<IEnumerable<TsysUserRoleViewModel>> GetUserRolesByUserIdAsync(Guid userId)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("userId", userId) };
            string sql = "SELECT C_UserCode,C_RoleCode FROM TSYS_UserRole where C_UserCode = @userId";
            IEnumerable<TsysUserRoleViewModel> result = EntityFrameworkCoreExtensions.GetList<TsysUserRoleViewModel>(DbContext.Database, sql, parameters);
            return Task.FromResult(result);
        }

        public Task<bool> DeleteByRoleIdAsync(Guid roleId)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("roleId", roleId) };
            string sql = "DELETE FROM TSYS_RolePriv where C_RoleCode = @roleId";
            int iResult = EntityFrameworkCoreExtensions.ExecuteSqlNoQuery(DbContext.Database, sql, parameters);
            return Task.FromResult(true);
        }
        public async Task CreateRolePrivAsync(TSYS_RolePriv entity)
        {
            await DbContext.Set<TSYS_RolePriv>().AddAsync(entity);
        }

        public Task<IEnumerable<TsysRolePrivViewModel>> GetRolePrivsByRoleIdAsync(string roleId)
        {
            MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("roleId", roleId) };
            string sql = "SELECT * FROM TSYS_RolePriv where C_RoleCode = @roleId";
            IEnumerable<TsysRolePrivViewModel> result = EntityFrameworkCoreExtensions.GetList<TsysRolePrivViewModel>(DbContext.Database, sql, parameters);
            return Task.FromResult(result);
            //var query = from a in DbContext.TSYS_RolePriv
            //            join b in DbContext.TSYS_Priv
            //            on a.C_PrivilegeCode equals b.C_Code
            //            where a.C_RoleCode.ToString() == roleId
            //            select new TSYS_Priv
            //            {
            //                C_Code = b.C_Code,
            //                C_ParentCode = b.C_ParentCode,
            //                C_Module = b.C_Module,
            //                C_Type = b.C_Type,
            //                C_Name = b.C_Name,
            //                I_Sort = b.I_Sort,
            //                C_ImageUrl = b.C_ImageUrl,
            //                C_PageUrl = b.C_PageUrl,
            //                C_Remark = b.C_Remark,
            //                C_Status = b.C_Status,
            //            };
            //var roleTypePrivList = query.ToList();
            //var treeList = new List<RolePrivTree>();
            //foreach (var item in roleTypePrivList.Where(m => m.C_ParentCode == null).OrderBy(m => m.I_Sort))
            //{
            //    //获得子级
            //    var children = RecursionRoleTypePriv(roleTypePrivList.Where(m => m.C_ParentCode != null).ToList(), new List<RolePrivTree>(), item.C_Code);
            //    treeList.Add(new RolePrivTree()
            //    {
            //        C_Code = item.C_Code,
            //        C_Name = item.C_Name,
            //        C_ParentCode = item.C_ParentCode,
            //        C_Type = item.C_Type,
            //        I_Sort = item.I_Sort,
            //        C_Remark = item.C_Remark,
            //        C_ImageUrl = item.C_ImageUrl,
            //        C_PageUrl = item.C_PageUrl,
            //        C_Module = item.C_Module,
            //        Open = children.Count > 0,
            //        Children = children.Count == 0 ? null : children
            //    });
            //}
            //var model = new RolePrivViewModel { RoleCode = roleId, RolePrivS = treeList };
            //return Task.FromResult(model);
        }
        List<RolePrivTree> RecursionRoleTypePriv(List<TSYS_Priv> sourceList, List<RolePrivTree> list, string guid)
        {
            foreach (var item in sourceList.Where(m => m.C_ParentCode.Equals(guid)))
            {
                var res = RecursionRoleTypePriv(sourceList, new List<RolePrivTree>(), item.C_Code);
                list.Add(new RolePrivTree()
                {
                    C_Code = item.C_Code,
                    C_Name = item.C_Name,
                    C_ParentCode = item.C_ParentCode,
                    C_Type = item.C_Type,
                    I_Sort = item.I_Sort,
                    C_Remark = item.C_Remark,
                    C_ImageUrl = item.C_ImageUrl,
                    C_PageUrl = item.C_PageUrl,
                    C_Module = item.C_Module,
                    Open = res.Count > 0,
                    Children = res.Count > 0 ? res : null
                });
            }
            return list;
        }
    }
}