using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace IControls_FireManager
{
    // cyim 2016.08.26
    // 대용량 수신기를 위해 기존의 코드중 15 번 통신카드는 이제 0번으로 대체해야한다. - 엑셀파일 포맷이 변경해야함
    // 수신기는 최대 8개의 통신카드 (통신카드당 2계통 커버) => 총 16 계통
    // 중계반은 최대 60개이고 (중계반은 4계통을 커버) -> 총 240 계통
    // 예외처리 사항
    // 1) 통신보드중 15번카드는 이제 0번카드로 대체 (IO 신호용)
    // 2) IO 보드는 어차피 셋팅이 의미없음  

    public partial class Form_Receiver_Port_BigReceiver : Form
    {
        _RECEIVER RECEIVER;
        string RECEIVER_ID;

        // 최대 64개 (수신기 8개 + 중계반 60개) , 단 UI 접근성을 위해 배열 인덱스를 그대로 사용하려함
        Boolean[] bCOMM_Use = new Boolean[65];
        Boolean[] bCOMM_CH1Use = new Boolean[65];
        Boolean[] bCOMM_CH2Use = new Boolean[65];
        Boolean[] bCOMM_CH3Use = new Boolean[65];
        Boolean[] bCOMM_CH4Use = new Boolean[65];
        Boolean[] bIO_Use = new Boolean[16];

        public Form_Receiver_Port_BigReceiver(int iIndex)
        {
            InitializeComponent();
            RECEIVER_ID = Convert.ToString(iIndex);
            RECEIVER = (_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID];
            ReceiverToObj();
        }

        private void UiButton_Confirm_Click(object sender, EventArgs e)
        {
            try
            {
                ObjToReceiver();
                ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Port4CommBoard = RECEIVER.Port4CommBoard;
                ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Port4IOBoard = RECEIVER.Port4IOBoard;
                ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Port4KeyPAD = RECEIVER.Port4KeyPAD;
                ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).Port4EmergencyBroadcast = RECEIVER.Port4EmergencyBroadcast;

                // DB 에 저장
                Form_Receiver_Add DbSave_For_Form_Receiver_Add = new Form_Receiver_Add(Int32.Parse(((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER_ID]).ID));
                DbSave_For_Form_Receiver_Add._Event_Project_Receiver_Save_Event();

                // 완료 이벤트 발생
                _Event.WorkViewPageName_Receiver_SendMessage_Write(RECEIVER.ID);

                // 저장하였습니다
                _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.OK, 250, 150, _Text.SaveInform, 0);

                // 프로젝트 수정
                _Data.ProJect_Save_Complete = false;
                Close();
            }
            catch (Exception ex)
            {
                // LOG                
                _Event.DebugView_SendMessage_Write(ex.ToString());
            }
        }

        // RECEIVER 객체의 값으로 화면 오브젝트의 값을 세팅한다.
        private void ReceiverToObj()
        {
            // GroupBox 데이터 넣기  (통신보드, IO보드, KeyPad, 비상방송 통신 관련 사항)
            gb_COMM1.Text = "통신보드 : " + RECEIVER.Port4CommBoard.Get_COM_PORT();
            gb_COMM2.Text = "IO보드 : " + RECEIVER.Port4IOBoard.Get_COM_PORT();
            gb_COMM3.Text = "키패드 : " + RECEIVER.Port4KeyPAD.Get_COM_PORT();
            gb_COMM4.Text = "비상방송 : " + RECEIVER.Port4EmergencyBroadcast.Get_COM_PORT();

            cb_COMM_USE.Checked = RECEIVER.Port4CommBoard.Use_Flag;
            cb_IO_USE.Checked = RECEIVER.Port4IOBoard.Use_Flag;
            cb_KEYPAD_USE.Checked = RECEIVER.Port4KeyPAD.Use_Flag;
            cb_EMER_USE.Checked = RECEIVER.Port4EmergencyBroadcast.Use_Flag;

            // 통신 보드
            cb_COMM1_PORT.SelectedIndex = RECEIVER.Port4CommBoard.PortNo - 1;
            cb_COMM1_BAUDRATE.Text = RECEIVER.Port4CommBoard.Get_COM_BAUDRATE();
            cb_COMM1_DATABITS.Text = RECEIVER.Port4CommBoard.DataBits.ToString();
            cb_COMM1_STOPBITS.Text = RECEIVER.Port4CommBoard.Get_COM_STOPBIT();
            cb_COMM1_PARITY.Text = RECEIVER.Port4CommBoard.Get_COM_PARITY();

            // I/O 보드
            cb_COMM2_PORT.SelectedIndex = RECEIVER.Port4IOBoard.PortNo - 1;
            cb_COMM2_BAUDRATE.Text = RECEIVER.Port4IOBoard.Get_COM_BAUDRATE();
            cb_COMM2_DATABITS.Text = RECEIVER.Port4IOBoard.DataBits.ToString();
            cb_COMM2_STOPBITS.Text = RECEIVER.Port4IOBoard.Get_COM_STOPBIT();
            cb_COMM2_PARITY.Text = RECEIVER.Port4IOBoard.Get_COM_PARITY();

            // KeyPad
            cb_COMM3_PORT.SelectedIndex = RECEIVER.Port4KeyPAD.PortNo - 1;
            cb_COMM3_BAUDRATE.Text = RECEIVER.Port4KeyPAD.Get_COM_BAUDRATE();
            cb_COMM3_DATABITS.Text = RECEIVER.Port4KeyPAD.DataBits.ToString();
            cb_COMM3_STOPBITS.Text = RECEIVER.Port4KeyPAD.Get_COM_STOPBIT();
            cb_COMM3_PARITY.Text = RECEIVER.Port4KeyPAD.Get_COM_PARITY();

            // 비상방송
            cb_COMM4_PORT.SelectedIndex = RECEIVER.Port4EmergencyBroadcast.PortNo - 1;
            cb_COMM4_BAUDRATE.Text = RECEIVER.Port4EmergencyBroadcast.Get_COM_BAUDRATE();
            cb_COMM4_DATABITS.Text = RECEIVER.Port4EmergencyBroadcast.DataBits.ToString();
            cb_COMM4_STOPBITS.Text = RECEIVER.Port4EmergencyBroadcast.Get_COM_STOPBIT();
            cb_COMM4_PARITY.Text = RECEIVER.Port4EmergencyBroadcast.Get_COM_PARITY();

            // 통신보드 및 중계반
            foreach (string COM_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).List_COM_BOARD_ID)
            {
                int iID;

                iID = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_ID;  // BOARDID

                if ((iID > -1) && (iID < 65)) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                {
                    // ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_NAME;  // BOARDID
                    bCOMM_CH1Use[iID] = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh1_Use_Flag;
                    bCOMM_CH2Use[iID] = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh2_Use_Flag;
                    bCOMM_CH3Use[iID] = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh3_Use_Flag;
                    bCOMM_CH4Use[iID] = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh4_Use_Flag;
                    bCOMM_Use[iID] = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bUse_Flag; //  Use Flag 
                }
            }

            // IO 보드
            foreach (string IO_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).List_IO_BOARD_ID)
            {
                int iID;

                iID = ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).BOARD_ID;  // BOARDID
                if ((iID > -1) && (iID < 16)) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                {
                    // ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_NAME;  // BOARDID
                    bIO_Use[iID] = ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).bUse_Flag; //  Use Flag 
                }
            }

            // 체크 박스 설정
            for (int i = 0; i < 65; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
            {
                //
                // 통신보드
                //

                // 사용 여부
                Control[] ctrl1 = this.Controls.Find(string.Format("cb_COMM{0}_Use", i), true);
                ((CheckBox)ctrl1[0]).Checked = bCOMM_Use[i];

                // 채널 체크여부
                Control[] ctrl2 = this.Controls.Find(string.Format("cb_COMM{0}_CH1Use", i), true);
                ((CheckBox)ctrl2[0]).Checked = bCOMM_CH1Use[i];
                Control[] ctrl3 = this.Controls.Find(string.Format("cb_COMM{0}_CH2Use", i), true);
                ((CheckBox)ctrl3[0]).Checked = bCOMM_CH2Use[i];

                //if (i > 8) // 9번 즉 중계반부터 채널이 4개이다
                {
                    Control[] ctrl4 = this.Controls.Find(string.Format("cb_COMM{0}_CH3Use", i), true);
                    ((CheckBox)ctrl4[0]).Checked = bCOMM_CH3Use[i];
                    Control[] ctrl5 = this.Controls.Find(string.Format("cb_COMM{0}_CH4Use", i), true);
                    ((CheckBox)ctrl5[0]).Checked = bCOMM_CH4Use[i];
                }

                //
                // IO 보드
                //

                if (i <= 15)
                {
                    Control[] ctrl6 = this.Controls.Find(string.Format("cb_IO{0}_Use", i), true);
                    ((CheckBox)ctrl6[0]).Checked = bIO_Use[i];
                }
            }
        }

        // 화면 오브젝트의 값을 RECEIVER 객체로 보낸다.
        private void ObjToReceiver()
        {
            // 포트
            RECEIVER.Port4CommBoard.Use_Flag = cb_COMM_USE.Checked;
            RECEIVER.Port4IOBoard.Use_Flag = cb_IO_USE.Checked;
            RECEIVER.Port4KeyPAD.Use_Flag = cb_KEYPAD_USE.Checked;
            RECEIVER.Port4EmergencyBroadcast.Use_Flag = cb_EMER_USE.Checked;

            // 통신 보드
            RECEIVER.Port4CommBoard.PortNo = cb_COMM1_PORT.SelectedIndex + 1;
            RECEIVER.Port4CommBoard.BaudRate = Util.StrToInt(cb_COMM1_BAUDRATE.Text, 0);
            RECEIVER.Port4CommBoard.DataBits = Util.StrToInt(cb_COMM1_DATABITS.Text, 0);
            RECEIVER.Port4CommBoard.Set_StopBits(cb_COMM1_STOPBITS.Text);
            RECEIVER.Port4CommBoard.Set_Parity(cb_COMM1_PARITY.Text);

            // I/O 보드
            RECEIVER.Port4IOBoard.PortNo = cb_COMM2_PORT.SelectedIndex + 1;
            RECEIVER.Port4IOBoard.BaudRate = Util.StrToInt(cb_COMM2_BAUDRATE.Text, 0);
            RECEIVER.Port4IOBoard.DataBits = Util.StrToInt(cb_COMM2_DATABITS.Text, 0);
            RECEIVER.Port4IOBoard.Set_StopBits(cb_COMM2_STOPBITS.Text);
            RECEIVER.Port4IOBoard.Set_Parity(cb_COMM2_PARITY.Text);

            // KeyPad
            RECEIVER.Port4KeyPAD.PortNo = cb_COMM3_PORT.SelectedIndex + 1;
            RECEIVER.Port4KeyPAD.BaudRate = Util.StrToInt(cb_COMM3_BAUDRATE.Text, 0);
            RECEIVER.Port4KeyPAD.DataBits = Util.StrToInt(cb_COMM3_DATABITS.Text, 0);
            RECEIVER.Port4KeyPAD.Set_StopBits(cb_COMM3_STOPBITS.Text);
            RECEIVER.Port4KeyPAD.Set_Parity(cb_COMM3_PARITY.Text);

            // 비상방송
            RECEIVER.Port4EmergencyBroadcast.PortNo = cb_COMM4_PORT.SelectedIndex + 1;
            RECEIVER.Port4EmergencyBroadcast.BaudRate = Util.StrToInt(cb_COMM4_BAUDRATE.Text, 0);
            RECEIVER.Port4EmergencyBroadcast.DataBits = Util.StrToInt(cb_COMM4_DATABITS.Text, 0);
            RECEIVER.Port4EmergencyBroadcast.Set_StopBits(cb_COMM4_STOPBITS.Text);
            RECEIVER.Port4EmergencyBroadcast.Set_Parity(cb_COMM4_PARITY.Text);

            // 체크 박스 설정
            for (int i = 0; i < 65; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
            {
                //
                // 통신보드
                //

                // 사용 여부
                Control[] ctrl1 = this.Controls.Find(string.Format("cb_COMM{0}_Use", i), true);
                bCOMM_Use[i] = ((CheckBox)ctrl1[0]).Checked;

                // 채널 체크여부
                Control[] ctrl2 = this.Controls.Find(string.Format("cb_COMM{0}_CH1Use", i), true);
                bCOMM_CH1Use[i] = ((CheckBox)ctrl2[0]).Checked;
                Control[] ctrl3 = this.Controls.Find(string.Format("cb_COMM{0}_CH2Use", i), true);
                bCOMM_CH2Use[i] = ((CheckBox)ctrl3[0]).Checked;

                //if (i > 8) // 9번 즉 중계반부터 채널이 4개이다
                {
                    Control[] ctrl4 = this.Controls.Find(string.Format("cb_COMM{0}_CH3Use", i), true);
                    bCOMM_CH3Use[i] = ((CheckBox)ctrl4[0]).Checked;
                    Control[] ctrl5 = this.Controls.Find(string.Format("cb_COMM{0}_CH4Use", i), true);
                    bCOMM_CH4Use[i] = ((CheckBox)ctrl5[0]).Checked;
                }

                //
                // IO 보드
                //

                if (i <= 15)
                {
                    Control[] ctrl6 = this.Controls.Find(string.Format("cb_IO{0}_Use", i), true);
                    bIO_Use[i] = ((CheckBox)ctrl6[0]).Checked;
                }
            }

            foreach (string COM_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).List_COM_BOARD_ID)
            {
                int iID;

                iID = ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_ID;  // BOARDID

                if ((iID > -1) && (iID < 65)) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                {
                    //((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_NAME,  // BOARDID
                    ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh1_Use_Flag = bCOMM_CH1Use[iID];
                    ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh2_Use_Flag = bCOMM_CH2Use[iID];
                    ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh3_Use_Flag = bCOMM_CH3Use[iID];
                    ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bCh4_Use_Flag = bCOMM_CH4Use[iID];
                    ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).bUse_Flag = bCOMM_Use[iID]; ; //  Use Flag 
                }
            }

            foreach (string IO_BOARD_ID in ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).List_IO_BOARD_ID)
            {
                int iID;

                iID = ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).BOARD_ID;  // BOARDID

                if ((iID > -1) && (iID < 16)) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
                {
                    // ((_COM_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_COM_BOARD[COM_BOARD_ID]).BOARD_NAME;  // BOARDID
                    ((_IO_BOARD)((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).Hash_IO_BOARD[IO_BOARD_ID]).bUse_Flag = bIO_Use[iID]; //  Use Flag 
                }
            }

            // cyim 2014.5.22  입출력수정을 해도 변동이 없는 상황 수정
            // COM 이 활성화되면 보드에서 당연히 사용한다
            ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).KEYPAD.bUse_Flag = cb_KEYPAD_USE.Checked;
            ((_RECEIVER)_Data.HASH_RECEIVER[RECEIVER.ID]).EMERGENCY_BROADCAST.Set_Use_Flag((cb_EMER_USE.Checked == true) ? "Y" : "N");
        }

        // 취소 버튼을 누르면, 그냥 화면을 닫는다.
        private void UiButton_cancel_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void checkBox_All_1_CheckedChanged(object sender, EventArgs e)
        {
            bool check = this.checkBox_All_1.Checked;
            for (int i = 1; i <= 21; i++)
            {
                // 사용 여부
                Control[] ctrl1 = this.Controls.Find(string.Format("cb_COMM{0}_Use", i), true);
                ((CheckBox)ctrl1[0]).Checked = check;
                // 채널 체크여부
                Control[] ctrl2 = this.Controls.Find(string.Format("cb_COMM{0}_CH1Use", i), true);
                ((CheckBox)ctrl2[0]).Checked = check;
                Control[] ctrl3 = this.Controls.Find(string.Format("cb_COMM{0}_CH2Use", i), true);
                ((CheckBox)ctrl3[0]).Checked = check;
                Control[] ctrl4 = this.Controls.Find(string.Format("cb_COMM{0}_CH3Use", i), true);
                ((CheckBox)ctrl4[0]).Checked = check;
                Control[] ctrl5 = this.Controls.Find(string.Format("cb_COMM{0}_CH4Use", i), true);
                ((CheckBox)ctrl5[0]).Checked = check;
            }
        }

        private void checkBox_All_2_CheckedChanged(object sender, EventArgs e)
        {
            bool check = this.checkBox_All_2.Checked;
            for (int i = 22; i <= 43; i++)
            {
                // 사용 여부
                Control[] ctrl1 = this.Controls.Find(string.Format("cb_COMM{0}_Use", i), true);
                ((CheckBox)ctrl1[0]).Checked = check;
                // 채널 체크여부
                Control[] ctrl2 = this.Controls.Find(string.Format("cb_COMM{0}_CH1Use", i), true);
                ((CheckBox)ctrl2[0]).Checked = check;
                Control[] ctrl3 = this.Controls.Find(string.Format("cb_COMM{0}_CH2Use", i), true);
                ((CheckBox)ctrl3[0]).Checked = check;
                Control[] ctrl4 = this.Controls.Find(string.Format("cb_COMM{0}_CH3Use", i), true);
                ((CheckBox)ctrl4[0]).Checked = check;
                Control[] ctrl5 = this.Controls.Find(string.Format("cb_COMM{0}_CH4Use", i), true);
                ((CheckBox)ctrl5[0]).Checked = check;
            }
        }

        private void checkBox_All_3_CheckedChanged(object sender, EventArgs e)
        {
            bool check = this.checkBox_All_3.Checked;
            for (int i = 44; i <= 64; i++)
            {
                // 사용 여부
                Control[] ctrl1 = this.Controls.Find(string.Format("cb_COMM{0}_Use", i), true);
                ((CheckBox)ctrl1[0]).Checked = check;
                // 채널 체크여부
                Control[] ctrl2 = this.Controls.Find(string.Format("cb_COMM{0}_CH1Use", i), true);
                ((CheckBox)ctrl2[0]).Checked = check;
                Control[] ctrl3 = this.Controls.Find(string.Format("cb_COMM{0}_CH2Use", i), true);
                ((CheckBox)ctrl3[0]).Checked = check;
                Control[] ctrl4 = this.Controls.Find(string.Format("cb_COMM{0}_CH3Use", i), true);
                ((CheckBox)ctrl4[0]).Checked = check;
                Control[] ctrl5 = this.Controls.Find(string.Format("cb_COMM{0}_CH4Use", i), true);
                ((CheckBox)ctrl5[0]).Checked = check;
            }
        }
        //
        // IO보드
        //

        private void checkBox_All_5_CheckedChanged(object sender, EventArgs e)
        {
            bool check = this.checkBox_All_5.Checked;
            for (int i = 0; i <= 15; i++) // cyim 2017.02.02 : IFC3300 에서는 통신보드, IO 보드 아이디가 0번이 존재한다
            {
                // 사용 여부
                Control[] ctrl1 = this.Controls.Find(string.Format("cb_IO{0}_Use", i), true);
                ((CheckBox)ctrl1[0]).Checked = check;
            }
        }
    }
}