using System;
using DeiNiu.wms.Data.Model;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using WcfServiceAuthentication;
namespace DeiNiu.wms.Logical
{
    [Serializable]
    public class LAuthority
    {
        Authority _obj;
        public LAuthority()
        {
           
            Initialize();
        }
        public Authority GetAuthority
        {
            get
            {
                return _obj;
            }
        }
		
		/// 
		/// get all data
		/// 
        public DataSet GetAllData()
        {
           return _obj.Query();
        }
        /// 
        /// get all data
        /// 
        public DataSet getAllActiveData()
        {
            return _obj.QueryActived();
        }
/*
        private void leavetypeDsConstruct()
        {
            return;
        }
*/
		
		/// 
		/// get a record by id
		/// 
        public void Initialize(int id)
		{
            _obj = id != 0 ? new Authority(id) : new Authority();
		}
        /// 
		/// get a record by id 0
		/// 
        public void Initialize()
        {
            Initialize(0);
        }
        public List getAuthorities()
        {
            List auths = new List();
            DataTable dt = getAllActiveData().Tables[0];
            foreach (DataRow row in dt.Rows)
            {
                int id = Convert.ToInt32(row["id"].ToString());
                Authority ath = new Authority(id);
                auths.Add(ath);
            }
            return auths;
        }
        public List getAuthorities(int empId, int warehouse)
        {
            
            List auths = new List();
            RoleAuthority  ll = new RoleAuthority();
            DataTable dt = ll.GetAuthByEm(empId, warehouse);
            foreach (DataRow row in dt.Rows)
            {
                int id = Convert.ToInt32(row["id"].ToString());
                Authority ath = new Authority(id);
                auths.Add(ath);
            }
            return auths;
        }
        public Dictionary> getMobileAuthorities(int empId)
        {
            Dictionary> auths = new Dictionary>();
            // DataView dv = new DataView(getAllActiveData().Tables[0]);
            DataView dv = _obj.queryCateAuths().DefaultView;
            List subAuths = getAuthorities(empId,-1); 
           foreach (Authority a in subAuths)
             {
                 dv.RowFilter = "id =" + a.auth_uplevel;
                 string key;
                 foreach (DataRowView dr in dv)
                 {
                     key = dr["auth_name"].ToString();
                     if (auths.ContainsKey(key))
                     {
                         auths[key].Add(a);
                     }
                     else
                     {
                         List sa = new List();
                         sa.Add(a);
                         auths.Add(key, sa);
                     }
                 }
             }
             
            return auths;
        }
      // public Dictionary> getCatedAuthorities(int empId,int warehouse=-1)
        public Dictionary> getCatedAuthorities(int empId,int warehouse=-1)
        {
            Dictionary> auths = new Dictionary>();
           // DataView dv = new DataView(getAllActiveData().Tables[0]);
            DataView dv = _obj.queryCateAuths().DefaultView;
            List subAuths = getAuthorities(empId,  warehouse );
           /*
            * foreach (Authority a in subAuths)
            {
                dv.RowFilter = "id =" + a.auth_uplevel;
                string key;
                foreach (DataRowView dr in dv)
                {
                    key = dr["auth_name"].ToString();
                    if (auths.ContainsKey(key))
                    {
                        auths[key].Add(a);
                    }
                    else
                    {
                        List sa = new List();
                        sa.Add(a);
                        auths.Add(key, sa);
                    }
                }
            }
            */
             
                foreach (DataRowView dr in dv)
                {
                    string formexists = dr["auth_class"].ToString();
                    string special = dr["auth_special"].ToString();
                    if (string.IsNullOrEmpty(formexists) 
                        && string.IsNullOrEmpty(special)
                        )
                    {
                        continue;
                    }
                    List sa = new List();
                    string key = dr["auth_name"].ToString();
                    auths.Add(key, sa);
                    foreach (Authority a in subAuths)
                    {
                        if (a.auth_uplevel == Convert.ToInt16(dr["id"].ToString()))
                        {  
                         //  string  key = dr["auth_name"].ToString();
                            if (auths.ContainsKey(key))
                            {
                                auths[key].Add(a);
                            }
                            else
                            {
                              //  List sa = new List();
                              //  sa.Add(a);
                              //  auths.Add(key, sa);
                            }
                        }
                    }
                }
             
            return auths;
        }
        bool validUser(string userId,string passwd)
        {
            Employee emp = new Employee();
            return emp.login(userId,passwd);
        }
        public int validUserRole(string userId, string passwd, string role)
        {
            Employee emp = new Employee();
           int id = emp.ValidUser(userId, passwd);
           if (id > 0)
           {
               Dictionary> auths = getMobileAuthorities(id);
               List auth = new List();
                
               if (auths.ContainsKey("细分权限"))
               {
                   List portAuth = auths["细分权限"];
                   foreach (Authority au in portAuth)
                   {
                       if (au.auth_name == role)
                       {
                           return id;
                       }
                   }
               }
           }
           return 0;
        }
        public Employee login(string account,string passwd)
        {
            Employee em = new Employee(); 
            if (em.login(account, passwd))
            {
                em.em_passwd = "";
                em.AuthForms = getAuthObjLst(em.ID, "移动设备");
                em.AuthSpecials = getAuthObjLst(em.ID, "细分权限");
               
            }
            AuthenticationInspector.checkRestrictUsers(em.ID);
            return em;
           
        }
       public List getAuthObjLst(int userId, string type = "")
        {
            Dictionary> auths = getMobileAuthorities(userId);
            List auth = new List();
            if (string.IsNullOrEmpty(type))
            {
                if (auths.Keys.Contains("移动设备"))
                {
                    List portAuth = auths["移动设备"];
                    foreach (Authority au in portAuth)
                    {
                        auth.Add(au);
                    }
                }
                if (auths.Keys.Contains("细分权限"))
                {
                    List portAuth = auths["细分权限"];
                    foreach (Authority au in portAuth)
                    {
                        auth.Add(au);
                    }
                }
            }
            else
            {
                if (auths.Keys.Contains(type))
                {
                    return auths[type];
                }
            }
            return auth;
        }
    }
}