using Ropin.Inspection.Common;
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 TsysOrganizeRepository : RepositoryBase<TSYS_Org, Guid>, ITsysOrganizeRepository
    {
        public TsysOrganizeRepository(InspectionDbContext dbContext) : base(dbContext)
        {

        }
        public int GetMaxKid()
        {
            //int iMax = from q in DbContext.TSYS_Org orderby q.K_ID descending select (q.K_ID); //DbContext.Database.SqlQuery("SELECT MAX(K_ID) From TSYS_Org");
            var table = DbContext.Database.SqlQuery("SELECT MAX(K_ID) From TSYS_Org");
            int iMax = Convert.ToInt32(table.Rows[0][0]) ;
            return iMax;
        }

        public async Task<List<TsysOrganizeTree>> GetListTreeAsync(string licenseTypeCode,string licenseCode, Guid? orgCode, string status)
        {
            //C_LicenseCode
            //MySqlConnector.MySqlParameter[] parameters = new[] { new MySqlConnector.MySqlParameter("qRCode", "") };
            //string sql = "SELECT * From TSYS_Org";
            //List<TsysOrganizeViewModel>  model = EntityFrameworkCoreExtensions.GetList<TsysOrganizeViewModel>(DbContext.Database, sql, parameters).ToList();
            //var v = DbContext.TSYS_Org.ToList();
            if (string.IsNullOrEmpty(licenseTypeCode))
                throw new Exception("没有许可证");
            IEnumerable<TSYS_Org> orgs = null;
            //if (licenseCode.StartsWith("SYSTEM"))
            if (licenseTypeCode == TsysLicenseType.SYSTEM)
                orgs = this.GetAll();
            else
                orgs = await this.GetByConditionAsync(a => a.C_LicenseCode == licenseCode);
            //IEnumerable<TSYS_Org> orgs = await this.GetByConditionAsync(a => a.C_LicenseCode == licenseCode);   //.GetAll().ToList();
            List<TSYS_Org> list = null;
            var treeList = new List<TsysOrganizeTree>();
            if(status!=null)
                list = orgs.Where(i=>i.C_Status ==status).ToList();
            else
                list = orgs.ToList();
            if (Guid.Empty.Equals(orgCode) || orgCode == null|| licenseCode.StartsWith("SYSTEM"))
            {
                foreach (var item in list.Where(m => m.C_ParentCode == null).OrderBy(m => m.I_Sort))  //&& m.C_Status == "1"
                {
                    //获得子级
                    var children = RecursionOrganize(list, new List<TsysOrganizeTree>(), item.C_Code);
                    treeList.Add(new TsysOrganizeTree()
                    {
                        K_ID = item.K_ID,
                        C_LicenseCode = item.C_LicenseCode,
                        //C_LicenseName = item.C_LicenseName,
                        C_Code = item.C_Code,
                        C_Name = item.C_Name,
                        C_SName = item.C_SName,
                        C_LName = item.C_LName,
                        C_Level = item.C_Level,
                        C_ParentCode = item.C_ParentCode,
                        C_Type = item.C_Type,
                        C_Phone = item.C_Phone,
                        C_Linker = item.C_Linker,
                        C_GIS = item.C_GIS,
                        I_Sort = item.I_Sort,
                        C_Remark = item.C_Remark,
                        C_CreateBy = item.C_CreateBy,
                        D_CreateOn = item.D_CreateOn,
                        C_LastUpdatedBy = item.C_LastUpdatedBy,
                        D_LastUpdatedOn = item.D_LastUpdatedOn,
                        C_Status = item.C_Status,
                        Open = children.Count > 0,
                        Children = children.Count == 0 ? null : children
                    });
                }
            }
            else
            {
                foreach (var item in list.Where(m => m.C_Code.Equals(orgCode) && m.C_Status == "1").OrderBy(m => m.I_Sort))
                {
                    //获得子级
                    var children = RecursionOrganize(list, new List<TsysOrganizeTree>(), orgCode);
                    treeList.Add(new TsysOrganizeTree()
                    {
                        K_ID = item.K_ID,
                        C_LicenseCode = item.C_LicenseCode,
                        C_Code = item.C_Code,
                        C_Name = item.C_Name,
                        C_SName = item.C_SName,
                        C_LName = item.C_LName,
                        C_Level = item.C_Level,
                        C_ParentCode = item.C_ParentCode,
                        C_Type = item.C_Type,
                        C_Phone = item.C_Phone,
                        C_Linker = item.C_Linker,
                        C_GIS = item.C_GIS,
                        I_Sort = item.I_Sort,
                        C_Remark = item.C_Remark,
                        C_CreateBy = item.C_CreateBy,
                        D_CreateOn = item.D_CreateOn,
                        C_LastUpdatedBy = item.C_LastUpdatedBy,
                        D_LastUpdatedOn = item.D_LastUpdatedOn,
                        C_Status = item.C_Status,
                        Open = children.Count > 0,
                        Children = children.Count == 0 ? null : children
                    });
                }
            }


            return await Task.Run(() => treeList);
        }
        public async Task<TsysOrg> GetOrgsByAsync(string licenseCode)
        {
            if (string.IsNullOrEmpty(licenseCode))
                throw new Exception("没有许可证");
            IEnumerable<TSYS_Org> orgs = null;
            if ("SYSTEM_001" == licenseCode)
                orgs =  this.GetAll();
               else
            orgs = await this.GetByConditionAsync(a => a.C_LicenseCode == licenseCode);   //.GetAll().ToList();
            List<TSYS_Org> list = orgs.ToList();
            TsysOrg tysOrg = new TsysOrg();
            tysOrg.OwnerOrgList = await GetOrganizeByTypeAsync(list, "PARTY_TYPE_001");
            tysOrg.PlatformOrgList = await GetOrganizeByTypeAsync(list, "PARTY_TYPE_004");
            tysOrg.SuperviseOrgList = await GetOrganizeByTypeAsync(list, "PARTY_TYPE_002");
            tysOrg.SupplierOrgList = await GetOrganizeByTypeAsync(list, "PARTY_TYPE_003");
            return await Task.Run(() => tysOrg);
        }
        async Task<List<TsysOrganizeTree>> GetOrganizeByTypeAsync(List<TSYS_Org> list,string type)
        {
            var treeList = new List<TsysOrganizeTree>();
            foreach (var item in list.Where(m => m.C_ParentCode == null && m.C_Type == type).OrderBy(m => m.I_Sort)) 
            {
                //获得子级
                var children = RecursionOrganize(list, new List<TsysOrganizeTree>(), item.C_Code);
                treeList.Add(new TsysOrganizeTree()
                {
                    K_ID = item.K_ID,
                    C_LicenseCode = item.C_LicenseCode,
                    C_Code = item.C_Code,
                    C_Name = item.C_Name,
                    C_SName = item.C_SName,
                    C_LName = item.C_LName,
                    C_Level = item.C_Level,
                    C_ParentCode = item.C_ParentCode,
                    C_Type = item.C_Type,
                    C_Phone = item.C_Phone,
                    C_Linker = item.C_Linker,
                    C_GIS = item.C_GIS,
                    I_Sort = item.I_Sort,
                    C_Remark = item.C_Remark,
                    C_CreateBy = item.C_CreateBy,
                    D_CreateOn = item.D_CreateOn,
                    C_LastUpdatedBy = item.C_LastUpdatedBy,
                    D_LastUpdatedOn = item.D_LastUpdatedOn,
                    C_Status = item.C_Status,
                    Open = children.Count > 0,
                    Children = children.Count == 0 ? null : children
                });
            }

            return await Task.Run(() => treeList);
        }


        public async Task<List<TsysOrganizeTree>> GetByOrganizeCodeAsync(Guid id)
        {
            List<TSYS_Org> list = this.GetAll().ToList().OrderBy(m => m.I_Sort).ToList();
            var treeList = new List<TsysOrganizeTree>();
            var item = list.Where(m => m.C_ParentCode.Equals(id)).FirstOrDefault(); //&& m.C_Status == "1"
            if (item != null)
            {
                //获得子级
                var children = RecursionOrganize(list, new List<TsysOrganizeTree>(), item.C_Code);
                treeList.Add(new TsysOrganizeTree()
                {
                    K_ID = item.K_ID,
                    C_LicenseCode = item.C_LicenseCode,
                    C_Code = item.C_Code,
                    C_Name = item.C_Name,
                    C_SName = item.C_SName,
                    C_LName = item.C_LName,
                    C_Level = item.C_Level,
                    C_ParentCode = item.C_ParentCode,
                    C_Type = item.C_Type,
                    C_Phone = item.C_Phone,
                    C_Linker = item.C_Linker,
                    C_GIS = item.C_GIS,
                    I_Sort = item.I_Sort,
                    C_Remark = item.C_Remark,
                    C_CreateBy = item.C_CreateBy,
                    D_CreateOn = item.D_CreateOn,
                    C_LastUpdatedBy = item.C_LastUpdatedBy,
                    D_LastUpdatedOn = item.D_LastUpdatedOn,
                    C_Status = item.C_Status,
                    Open = children.Count > 0,
                    Children = children.Count == 0 ? null : children
                });
            }

            return await Task.Run(() => treeList);
        }

        List<TsysOrganizeTree> RecursionOrganize(List<TSYS_Org> sourceList, List<TsysOrganizeTree> list, Guid? guid)
        {
            foreach (var row in sourceList.Where(m => m.C_ParentCode.Equals(guid) ).OrderBy(m => m.I_Sort))// && m.C_Status == "1"
            {
                var res = RecursionOrganize(sourceList, new List<TsysOrganizeTree>(), row.C_Code);
                list.Add(new TsysOrganizeTree()
                {
                    K_ID = row.K_ID,
                    C_LicenseCode = row.C_LicenseCode,
                    C_Code = row.C_Code,
                    C_Name = row.C_Name,
                    C_SName = row.C_SName,
                    C_LName = row.C_LName,
                    C_Level = row.C_Level,
                    C_ParentCode = row.C_ParentCode,
                    C_Type = row.C_Type,
                    C_Phone = row.C_Phone,
                    C_Linker = row.C_Linker,
                    C_GIS = row.C_GIS,
                    I_Sort = row.I_Sort,
                    C_Remark = row.C_Remark,
                    C_CreateBy = row.C_CreateBy,
                    D_CreateOn = row.D_CreateOn,
                    C_LastUpdatedBy = row.C_LastUpdatedBy,
                    D_LastUpdatedOn = row.D_LastUpdatedOn,
                    C_Status = row.C_Status,
                    Open = res.Count > 0,
                    Children = res.Count > 0 ? res : null
                });
            }
            return list;
        }
    }
}