using ClientLib;
using ClientLib.CommonService;
using DevExpress.XtraEditors;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Nodes;
using PublicLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HANMI_STD
{
    public partial class CodeManager : CommonMDI
    {

        DataView m_Group_View;
        DataView m_Code_View;

        public CodeManager()
        {
            InitializeComponent();


            this.Shown += (sender, e) =>
            {
                try
                {
                    SerializedSqlParam[] aParam = new SerializedSqlParam[] {
                    ClientClass.CreateSqlParameter("COMP_CD", SqlDbType.NVarChar, ConstClass._COMP_CD)
                };

                    ResultData result = ClientClass.GetData("GetRoutingManager", aParam);
                    if (result.isError)
                    {
                        throw new Exception(result.ResultValue);
                    }
                    UtilClass.SetLookup(repositoryItemLookUpEdit_ROUT_CD, result.TableData, "ROUT_CD", "ROUT_NM", false, false);

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

                searchProc();
            };


            simpleButton_AddMain.Click += (sender, e) =>
            {
                InsertCateForm from = new InsertCateForm();
                if (from.ShowDialog() != System.Windows.Forms.DialogResult.Yes)
                {
                    return;
                }
                searchProc();
            };

            gridControl_Main.DoubleClick += (sender, e) =>
            {
                DataRow row = bandedGridView_Main.GetFocusedDataRow();

                if (row != null)
                {
                    InsertCateForm form = new InsertCateForm();
                    form.setData(row);

                    if (form.ShowDialog() == System.Windows.Forms.DialogResult.Yes)
                    {
                        searchProc();
                    }
                }
            };

            simpleButton_DeleteMain.Click += (sender, e) =>
            {
                bandedGridView_Main.PostEditor();
                bandedGridView_Main.UpdateCurrentRow();
                Application.DoEvents();

                DataTable data = gridControl_Main.DataSource as DataTable;
                DataRow[] rows = data.Select("SEL_YN = 'Y'");
                if (rows == null || rows.Length < 1)
                {
                    MessageBox.Show("삭제할 항목을 선택하십시오.");
                    return;
                }
                foreach (DataRow row in rows)
                {
                    row.Delete();
                }
            };


            gridControl_Group.DoubleClick += (sender, e) =>
            {
                DataRow row = bandedGridView_Group.GetFocusedDataRow();

                if (row != null)
                {
                    DataRow mrow = bandedGridView_Main.GetFocusedDataRow();
                    InsertGroupForm form = new InsertGroupForm(UtilClass.toStr(mrow["CATE_CD"]));
                    form.setData(row);

                    if (form.ShowDialog() == System.Windows.Forms.DialogResult.Yes)
                    {
                        searchProc();
                    }
                }
            };

            simpleButton_AddGroup.Click += (sender, e) =>
            {
                DataRow mrow = bandedGridView_Main.GetFocusedDataRow();
                InsertGroupForm from = new InsertGroupForm(UtilClass.toStr(mrow["CATE_CD"]));
                if (from.ShowDialog() != System.Windows.Forms.DialogResult.Yes)
                {
                    return;
                }
                searchProc();
            };

            simpleButton_DeleteGroup.Click += (sender, e) =>
            {
                bandedGridView_Group.PostEditor();
                bandedGridView_Group.UpdateCurrentRow();
                Application.DoEvents();

                DataTable data = m_Group_View.Table;
                DataRow[] rows = data.Select("SEL_YN = 'Y'");
                if (rows == null || rows.Length < 1)
                {
                    MessageBox.Show("삭제할 항목을 선택하십시오.");
                    return;
                }
                foreach (DataRow row in rows)
                {
                    row.Delete();
                }
            };

            bandedGridView_Main.FocusedRowChanged += (sender, e) =>
            {
                DataRow row = bandedGridView_Main.GetFocusedDataRow();

                if (row != null)
                {
                    if (m_Group_View != null)
                    {
                        m_Group_View.RowFilter = " CATE_CD = '" + UtilClass.toStr(row["CATE_CD"]) + "'";


                        DataRow grow = bandedGridView_Group.GetFocusedDataRow();

                        if (grow != null)
                        {
                            if (m_Code_View != null)
                            {
                                m_Code_View.RowFilter = " CATE_CD = '" + UtilClass.toStr(grow["CATE_CD"]) + "'" +
                                                        " AND GRP_CD = '" + UtilClass.toStr(grow["GRP_CD"]) + "'";
                            }
                        }
                        else 
                        {
                            if (m_Code_View != null)
                            {
                                m_Code_View.RowFilter = " CATE_CD = ''" +
                                                        " AND GRP_CD = ''";
                            }
                        }
                    }
                }
            };

            bandedGridView_Group.FocusedRowChanged += (sender, e) =>
            {
                DataRow row = bandedGridView_Group.GetFocusedDataRow();

                if (row != null)
                {

                    if (m_Code_View != null)
                    {
                        m_Code_View.RowFilter = " GRP_CD = '" + UtilClass.toStr(row["GRP_CD"]) + "'";
                    }
                }
            };

            bandedGridView_Main.FocusedRowChanged += (sender, e) =>
            {
                DataRow row = bandedGridView_Main.GetFocusedDataRow();
                bandedGridView_Main.Columns["CATE_CD"].OptionsColumn.AllowEdit = row != null && (row.RowState == DataRowState.Added || row.RowState == DataRowState.Detached);
            };

            bandedGridView_Group.FocusedRowChanged += (sender, e) =>
            {
                DataRow row = bandedGridView_Group.GetFocusedDataRow();
                bandedGridView_Group.Columns["GRP_CD"].OptionsColumn.AllowEdit = row != null && (row.RowState == DataRowState.Added || row.RowState == DataRowState.Detached);
            };

            bandedGridView_Code.FocusedRowChanged += (sender, e) =>
            {
                DataRow row = bandedGridView_Code.GetFocusedDataRow();
                bandedGridView_Code.Columns["NO_CD"].OptionsColumn.AllowEdit = row != null && (row.RowState == DataRowState.Added || row.RowState == DataRowState.Detached);
            };

        }

        public override void searchProc()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                ResultData result = ClientClass.GetData("GetCodeManager", null);
                if (result.isError)
                {
                    throw new Exception(result.ResultValue);
                }

                gridControl_Main.DataSource = result.DataList.Tables[0];
                m_Group_View = new DataView(result.DataList.Tables[1]);
                m_Code_View = new DataView(result.DataList.Tables[2]);

                if (result.DataList.Tables[0].Rows.Count > 0)
                {
                    DataRow row = result.DataList.Tables[0].Rows[0];
                    m_Group_View.RowFilter = " CATE_CD = '" + UtilClass.toStr(row["CATE_CD"]) + "'";
                }

                if (m_Group_View != null && m_Group_View.Count > 0)
                {
                    DataRow row = m_Group_View.Table.Rows[0];
                    m_Code_View.RowFilter = " CATE_CD = '" + UtilClass.toStr(row["CATE_CD"]) + "'" +
                                            " AND GRP_CD = '" + UtilClass.toStr(row["GRP_CD"]) + "'";
                }
                else
                {
                    m_Code_View.RowFilter = " CATE_CD = ''" +
                                            " AND GRP_CD = ''";
                }

                gridControl_Group.DataSource = m_Group_View;
                gridControl_Code.DataSource = m_Code_View;

                this.Cursor = Cursors.Arrow;
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Arrow;
                MessageBox.Show(ex.Message);
            }
        }

        public override void newProc()
        {
            DataRow row = bandedGridView_Group.GetFocusedDataRow();

            bandedGridView_Code.AddNewRow();
            bandedGridView_Code.GetFocusedDataRow()["CATE_CD"] = UtilClass.toStr(row["CATE_CD"]);
            bandedGridView_Code.GetFocusedDataRow()["GRP_CD"] = UtilClass.toStr(row["GRP_CD"]);
            bandedGridView_Code.GetFocusedDataRow()["DEL_YN"] = "N";
        }

        public override void deleteProc()
        {
            bandedGridView_Code.PostEditor();
            bandedGridView_Code.UpdateCurrentRow();
            Application.DoEvents();

            DataTable data = m_Code_View.Table;
            DataRow[] rows = data.Select("SEL_YN = 'Y'");
            if (rows == null || rows.Length < 1)
            {
                MessageBox.Show("삭제할 항목을 선택하십시오.");
                return;
            }
            foreach (DataRow row in rows)
            {
                row.Delete();
            }
        }

        public override void saveProc()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                bandedGridView_Main.PostEditor();
                bandedGridView_Main.UpdateCurrentRow();
                bandedGridView_Group.PostEditor();
                bandedGridView_Group.UpdateCurrentRow();
                bandedGridView_Code.PostEditor();
                bandedGridView_Code.UpdateCurrentRow();
                Application.DoEvents();


                DataTable aData = gridControl_Main.DataSource as DataTable;
                DataTable bData = m_Group_View.Table; // gridControl_Group.DataSource as DataTable;
                DataTable cData = m_Code_View.Table; //gridControl_Code.DataSource as DataTable;

                ResultData[] dataList = null;

                ResultData data1 = new ResultData();
                DataTable dtData1 = UtilClass.GetDataTable(aData, true,
                    "CATE_CD", "CATE_CD_NM", "PRNNO"
                );
                dtData1.TableName = "ADATA";
                data1.TableData = dtData1;

                ResultData data2 = new ResultData();
                DataTable dtData2 = UtilClass.GetDataTable(bData, true,
                    "CATE_CD", "GRP_CD", "GRP_CD_NM", "PRNNO"
                );
                dtData2.TableName = "BDATA";
                data2.TableData = dtData2;

                ResultData data3 = new ResultData();
                DataTable dtData3 = UtilClass.GetDataTable(cData, true,
                    "CATE_CD", "GRP_CD", "NO_CD", "NO_CD_NM",
                    "DEL_YN", "NO_RMK", "PRNNO", "WORK_ROUT_CD"
                );
                dtData3.TableName = "CDATA";
                data3.TableData = dtData3;


                for (int i = 0; i < dtData3.Rows.Count; i++)
                {
                    if (UtilClass.isNull(dtData3.Rows[i]["NO_CD"]))
                    {
                        throw new Exception("코드가 입력되지 않은 데이터가 있습니다.");
                    }
                    if (UtilClass.isNull(dtData3.Rows[i]["NO_CD_NM"]))
                    {
                        throw new Exception(UtilClass.toStr(dtData3.Rows[i]["NO_CD"]) + "코드의 코드명이 입력되지 않았습니다.");
                    }
                }

                dataList = new ResultData[] { data1, data2, data3 };

                ResultData result = ClientClass.SetTableData("SaveCodeManager", dataList, null);
                if (result.isError)
                {
                    throw new Exception(result.ResultValue);
                }

                MessageBox.Show("정상적으로 저장하였습니다.");

                aData.AcceptChanges();
                bData.AcceptChanges();
                cData.AcceptChanges();

                this.Cursor = Cursors.Arrow;
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Arrow;
                MessageBox.Show(ex.Message);
            }
        }
    }
}