using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using DeiNiu.wms.Logical;
using DeiNiu.Utils;
using DeiNiu.wms.Data.Model;
public partial class DeptMain : PageBase
{
    private LDepartment _logic;
    protected void Page_Load(object sender, EventArgs e)
    {
  
        if (!IsPostBack)
        {
            _logic = new LDepartment();
            Databound();
        }
        SessionSeting();
    }
 
    /*****************************************   private methods   ******************************************/
    /// 
    /// bound the query list.
    /// 
    private void Databound()
    { 
        //绑定部门列表
        drplstDept.DataSource = _logic.GetAllActiveData();
        drplstDept.DataTextField = "dep_name";
        drplstDept.DataValueField = "ID";
        drplstDept.DataBind();
    
        drplstDept.Items.Insert(0, (new ListItem("WMS", "0")));
        drplstDept.SelectedItem.Selected = false;
        drplstDept.Items.FindByText("WMS").Selected = true;
        //绑定部门人员列表
         DropDownList1.DataSource = _logic.GetEmployees();
        DropDownList1.DataTextField = "em_name";
        DropDownList1.DataValueField = "ID";
        DropDownList1.DataBind();
        DropDownList1.Items.Insert(0,(new ListItem("请选择...","0")));
        DropDownList1.SelectedItem.Selected = false;
        DropDownList1.Items.FindByText("请选择...").Selected = true;
        //装载选定部门节点的部门数据 
        dlstDeptType.Items.Clear();
        dlstDeptType.Items.Add(new ListItem("普通", "0")); 
        dlstDeptType.Items.Add(new ListItem("仓管", "1"));
        dlstDeptType.Items.Add(new ListItem("仓库", "2")); 
        dlstDeptType.Items.Add(new ListItem("三方", "3"));
        DataView dv = _logic.GetAllActiveData().DefaultView;
        string selectedValue = TreeDept.SelectedValue;
        TreeDept.Nodes.Clear();
        TreeDept.Nodes.Add(new TreeNode("WMS", "0"));
        TreeDept.Nodes[0].Expanded = true;
        BindTree("0", TreeDept.Nodes[0], dv);
        //   TreeDept.SelectedNode.ChildNodes.Clear();
        //     BindTree(TreeDept.SelectedValue, TreeDept.SelectedNode, dv);
        //     TreeDept.Nodes.AddAt(0, new TreeNode("WMS", "0"));
        if (selectedValue == "0") TreeDept.Nodes[0].Selected = true;
        else
        {
            setTreeDeptSelected(selectedValue, TreeDept.Nodes[0]);
        }
       dv.RowFilter = "dep_mastdept = '" + selectedValue + "'";
       bindGridview(dv);
       
        UpdateSession();
    // btnSubmit.Enabled = false;
      //  ClearDetail();
        drplstDept.Items.Clear();
        initializeDrlstDept(TreeDept.Nodes, drplstDept ,"");
    }
    void bindGridview(DataView dv )
    {
       
        //绑定树列表里选中的部门下的所有部门数据
       
        foreach (DataRowView drv in dv)
        {
            foreach (ListItem li in dlstDeptType.Items)
            {
                if (drv["dep_type"].ToString().Equals(li.Value))
                {
                    drv.Row["typeName"] = li.Text;
                }
            }
        }
        GridView1.DataSource = dv;
        GridView1.DataBind();
    }
    void initializeDrlstDept(TreeNodeCollection nds, DropDownList drplist, string emptyString)
    {
        
       
        foreach (TreeNode nd in nds)
        {
            
            ListItem li = new ListItem(emptyString + nd.Text,nd.Value);
            drplist.Items.Add(li); 
            string NextemptyString = emptyString+ "----";
            foreach (TreeNode nd1 in nd.ChildNodes)
            {
               li = new ListItem(NextemptyString + nd1.Text, nd1.Value);
                    drplist.Items.Add(li);
                   
                if (nd1.ChildNodes.Count > 0)
                {
                    NextemptyString +="----";
                   initializeDrlstDept(nd1.ChildNodes, drplist, NextemptyString);
                }
            }
        }
    }
    void setTreeDeptSelected(string toFind,TreeNode nd)
    {
        foreach (TreeNode cnd in nd.ChildNodes)
        {
            if (cnd.Value == toFind) 
            {
                cnd.Selected = true;
                break;
            }
            else
            {
                setTreeDeptSelected(toFind,cnd);
            }
        }
    }
    private void SessionSeting()
    {
        if (IsPostBack)
        {
            _logic = (LDepartment)Session[appScope.PagelevelObj];
        }
    }
    private void UpdateSession()
    {
        Session[appScope.PagelevelObj] = _logic;
    }
    /// 
    /// set data from shift object to page
    /// 
    private void DetailDataBind()
    {
        DataDetail.Visible = true;
        txtDepName.Text = _logic.GetDepartment.dep_name ;
        txtDepcode.Text = _logic.GetDepartment.dep_code;
        txtDepDesc.Text = _logic.GetDepartment.dep_desc;
        txtSvrAddress.Text = _logic.GetDepartment.svrAdress;
       // txtDepType.Text = _logic.GetDepartment.dep_type+"";
        DropDownList1.SelectedItem.Selected = false;
        if(DropDownList1.Items.FindByValue(_logic.GetDepartment.dep_manager.ToString())!=null)
        {
          DropDownList1.Items.FindByValue(_logic.GetDepartment.dep_manager.ToString()).Selected = true;  
        }
        drplstDept.SelectedItem.Selected = false;
        if (drplstDept.Items.FindByValue(_logic.GetDepartment.dep_mastdept.ToString()) != null)
        {
            drplstDept.Items.FindByValue(_logic.GetDepartment.dep_mastdept.ToString()).Selected = true;
        }
        dlstDeptType.SelectedItem.Selected = false;
        if (dlstDeptType.Items.FindByValue(_logic.GetDepartment.dep_type.ToString()) != null)
        {
            dlstDeptType.Items.FindByValue(_logic.GetDepartment.dep_type.ToString()).Selected = true;
        }
        
         
//    chkStatus.Checked = _logic.GetRole.dr;
    }
    /************************************** protected methods (event listeners) ********************************/
    protected void btnAddnew_Click(object sender, EventArgs e)
    {
        chgOperTxt(true);
        _logic.Initialize();
        DetailDataBind();
        GridView1.SelectedIndex = -1;
        Databound();
        drplstDept.SelectedItem.Selected = false;
        if (drplstDept.Items.FindByValue(TreeDept.SelectedNode.Value) != null)
        {
            drplstDept.Items.FindByValue(TreeDept.SelectedNode.Value).Selected = true;
        }
    }
    protected void DetailsView1_PageIndexChanging(object sender, DetailsViewPageEventArgs e)
    {
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        chgOperTxt(false);
        if (GridView1.DataKeys != null)
        {
            string id = GridView1.DataKeys[e.NewEditIndex].Value.ToString();
            _logic.Initialize(int.Parse(id));
        }
        Databound();
        DetailDataBind();
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        SetDataBack();
        //shifts id eq 0 means this is new one,to add; else an old one, to update
        if (_logic.GetDepartment.ID > 0)
        {
            _logic.GetDepartment.Update();
        }
        else
        {
            _logic.GetDepartment.Add();
            if (_logic.GetDepartment.warehouse == 0 && _logic.GetDepartment.dep_type==1)
            {
                _logic.GetDepartment.warehouse = _logic.GetDepartment.ID;
                _logic.GetDepartment.Update();
            }
        }
        
        ClearDetail();
        Databound();
    }
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        
        if (GridView1 != null)
        {
            if (GridView1.DataKeys != null)
            {
                string id = GridView1.DataKeys[e.RowIndex].Value.ToString();
                _logic.Initialize(int.Parse(id));
            }
        }
        /*
        _logic.GetRole.dr = false;
        _logic.GetRole.Update();
        
       */
        _logic.GetDepartment.Delete();
        ClearDetail();
        Databound();
    }
    protected void GridView1_PageIndexChanged(object sender, EventArgs e)
    {
    }
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        Databound();
        //GridView1.DataSource = shiftLgc.getAllShifts().Tables[0];
        //     GridView1.DataBind();    
    }
    protected void GridView1_DataBinding(object sender, EventArgs e)
    {
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        /*
        CheckBox chk;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            chk = new CheckBox();
            chk.Text = "激活";
            chk.Enabled = false;
            chk.Checked = e.Row.Cells[3].Text.Trim().Equals("1");
            e.Row.Cells[3].Controls.Add(chk);
        }
      */
    }
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
    }
    //reset the page
    protected void btnCancel_Click(object sender, EventArgs e)
    {
        _logic.Initialize();
        Page_Load(this, e);
    }
    /***************************************** internal methods ********************************************/
    /// 
    /// set data from page to shift object
    /// 
    private void SetDataBack()
    {
        //    _logic.GetRole.operater = Session["CurrentUserID"].ToString();  todo: write a public method to handle operater,createtime,lastmodfied ... log info.
       if (!(_logic.GetDepartment.ID > 0 )) 
       {
         // _logic.GetDepartment.lastmodified = DateTime.Now.ToString(); 
          _logic.GetDepartment.dep_mastdept = Convert.ToInt32(TreeDept.SelectedValue);
       }
        
      // _logic.GetDepartment.dr = true;
       _logic.GetDepartment.dep_name = txtDepName.Text;
       _logic.GetDepartment.dep_desc = txtDepDesc.Text;
       _logic.GetDepartment.dep_code = txtDepcode.Text; 
        _logic.GetDepartment.svrAdress =  txtSvrAddress.Text;
       if (dlstDeptType.SelectedItem != null) _logic.GetDepartment.dep_type = Convert.ToInt16(dlstDeptType.SelectedValue); 
        if (DropDownList1.SelectedItem != null ) _logic.GetDepartment.dep_manager = Convert.ToInt32(DropDownList1.SelectedValue);
        if (drplstDept.SelectedItem != null) _logic.GetDepartment.dep_mastdept = Convert.ToInt32(drplstDept.SelectedValue);
        if (_logic.GetDepartment.dep_type != (int)enumDepartmentType.仓库)//本部门不是仓库类型
        {
            if (_logic.GetDepartment.dep_mastdept > 0) //继承上级部门的仓库属性
            {
                Department dept = new Department(_logic.GetDepartment.dep_mastdept);
                if (dept.dep_type != 1)
                {
                    _logic.GetDepartment.warehouse = dept.warehouse;
                }
                else
                {
                    _logic.GetDepartment.warehouse = dept.ID;
                }
            }
        }
        else
        {
            _logic.GetDepartment.warehouse = _logic.GetDepartment.ID;
           
        }
    
    }
    private void chgOperTxt(bool addNew)
    {
        DataDetail.Visible = true;
        lbEdit.Text = addNew ? "增加新记录" : "修改现有记录";
        btnSubmit.Enabled = true;
    }
    private void ClearDetail()
    {
        txtDepName.Text = "";
        txtDepcode.Text = "";
        txtDepDesc.Text = "";
        //txtDepType.Text ="";
        DataDetail.Visible = false;
    }
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        chgOperTxt(false);
        if (GridView1.DataKeys != null)
        {
            string id = GridView1.DataKeys[GridView1.SelectedIndex].Value.ToString();
            _logic.Initialize(int.Parse(id));
        }
        Databound();
        DetailDataBind();
    }
    public void BindTree(string id, TreeNode pNode, DataView dv)
    {
        
        dv.RowFilter = "dep_mastdept = '" + id + "'";
        foreach (DataRowView row in dv)
        {
            TreeNode node = new TreeNode();
            node.Text = row["dep_name"].ToString();
            node.Value = row["ID"].ToString();
            if (pNode == null)
                //说明是根节点
            {
            
                TreeDept.Nodes.Add(node);
                node.Expanded = true;
      
            }
            else
            {
                pNode.ChildNodes.Add(node);
                node.Expanded = true;
                
            }
            BindTree(node.Value, node, new DataView(dv.Table));
        }
    }
    protected void TreeDept_SelectedNodeChanged(object sender, EventArgs e)
    {
       GridView1.SelectedIndex = -1; 
        DataView dv = new DataView(_logic.GetAllActiveData()); 
        dv.RowFilter = "dep_mastdept = '" + TreeDept.SelectedValue + "'"; 
        bindGridview(dv);
        ClearDetail();
    }
}