using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using UtopiaAttService;

namespace FaceTransfer
{
    public partial class Form1 : Form
    {
        public zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass();
        private bool bIsConnected = false;//the boolean value identifies whether the device is connected

        public static string filePath = "credentials.txt";
        private CheckBox headerCheckBox;
        private CheckBox headerCheckBox2;
        private CheckBox headerCheckBox3;
        string machineid1From;
        string machineid2To;
        private int count = 0;
        int totalrecord = 0;
        static string devInfo2;
        static string machineid2;


        static ConnectionClass ObjConnectionClass = new ConnectionClass();
        static MachineConnectivity machineConnectivity = new MachineConnectivity();
        RegisteredUsers RegisteredUsers = new RegisteredUsers();
        AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();

        static MySqlConnection connection;
        private AttendanceMachine Machine;
        private BackgroundWorker backgroundWorker;
        StringBuilder responseStringBuilder = new StringBuilder();
        List<Attendance> MachineEmployeeList = new List<Attendance>();

        CallBack myCallBack = new CallBack(machineConnectivity.BeCalled);


        public Form1()
        {
            InitializeComponent();
            SetGridView1();
            SetGridView2();
            SetGridView3();
            SetBackgroundWorker();
            //addColumnMachineGrid();
            dateTimePicker1.Format = DateTimePickerFormat.Custom;
            dateTimePicker1.CustomFormat = "yyyy-MM-dd";

        }
        private void Form1_Load(object sender, EventArgs e)
        {
            bindDropDownMachineIp();
            // Enable auto-scrolling for the form
            this.AutoScroll = true;
            this.HorizontalScroll.Enabled = false;
            this.VerticalScroll.Enabled = false;
        }

        private void addColumnMachineGrid()
        {
            DataGridViewTextBoxColumn idColumn = new DataGridViewTextBoxColumn();
            idColumn.HeaderText = "Employee ID"; // Set the header text for the column

            // Add the column to the DataGridView
            DataGvMachine.Columns.Add(idColumn);


        }


        private void SetBackgroundWorker()
        {
            backgroundWorker = new BackgroundWorker();
            backgroundWorker.WorkerReportsProgress = true;
            backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
            backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
            backgroundWorker.ProgressChanged += Bg_ProgressChanged;
        }
        private void Bg_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

            if (backgroundWorker.CancellationPending)
            {
                // Handle the progress update only if the background worker is not canceled
                return;
            }

            if (e.ProgressPercentage == 0)
            {
                UpdateUITask(machineid1From, machineid2To);
            }
            if (e.ProgressPercentage == 1)
            {
                lblTotalEmp.Text = "Total emp : " + e.UserState.ToString();
            }

            if (e.ProgressPercentage == 2)
            {
                lblResult.Text = "Emp: " + e.UserState + "  ---> transferred";
            }
            if (e.ProgressPercentage == 3)
            {
                lblResult.Text = "Emp: " + e.UserState + "  ---> transferred";
            }

        }

        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {

        }

        private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {

            if (backgroundWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            RunFaceTransfer();
        }

        /// ////////////////////////////////////--------------- BACKGROUND WORKER COMPLETE --------------------/////////////////////////



        private void btn_sync_Click(object sender, EventArgs e)
        {

            if (dateTimePicker1.Text.Length > 0 && cb_machineFrom.SelectedIndex > 0)
            {
                List<string> response = syncAttendance();
                if (response.Count != 0)
                {
                    MessageBox.Show("Completed");
                }
                else
                {
                    MessageBox.Show("Sync not completed");
                }


            }
            else
            {
                MessageBox.Show("Please provide proper data");
            }
        }
        public List<string> syncAttendance()
        {

            List<string> responses = new List<string>();

            connection = ObjConnectionClass.Connection();


            if (ObjConnectionClass.OpenConnection() == true)
            {
                AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();

                string machineIp = cb_machineFrom.SelectedValue.ToString();

                List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", machineIp);

                foreach (var machine in machines)
                {
                    responses.Add(PostAttendance(machine));
                }
            }

            ObjConnectionClass.CloseConnection();


            return responses;
        }
        public string PostAttendance(AttendanceMachine machine)
        {

            string response = "";
            DateTime now = DateTime.Now.AddMinutes(-5);

            string devInfo = machine.GetDeviceInfo();
            //string str4 = "GetRecord(start_time=\"" + machine.LastSyncDate.ToString("yyyy-MM-dd HH:mm:ss") + "\")";

            string date = dateTimePicker1.Text.ToString();
            date = date + " 00:00:00";
            string str4 = "GetRecord(start_time=\"" + date + "\")";

            string str5 = "";
            uint num2 = 0;
            if (machineConnectivity.ExecuteCommad(devInfo, devInfo.Length, str4, str4.Length, ref str5, ref num2, myCallBack) != 0)
            {
                Console.WriteLine("Not Connected");
                response = machine.MachineId + " is not connected !";
            }
            else
            {
                Console.WriteLine("Connected");
                // response = machine.MachineId + " has " + GetLoopCnt(str5) + " records !";
                Console.WriteLine(response);
                machine.LastSyncDate = now;
                SaveRows(str5, machine);

            }
            return response;
        }
        public void SaveRows(string response, AttendanceMachine machine)
        {

            AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();
            AttendanceDAO attendanceDAO = new AttendanceDAO();
            string[] allObj = response.Split(new string[] { "time" }, StringSplitOptions.None);

            totalrecord = GetTotal(allObj[0]);
            // Set ProgressBar properties
            lb_total.Text = "Total 0/" + totalrecord + "";
            progressBar1.Minimum = 0;
            progressBar1.Maximum = totalrecord;



            int count = 0;
            for (int i = 0; i < allObj.Length; i++)
            {
                string s = allObj[i];


                if (!s.Contains("Return"))
                {
                    string[] objDetail = s.Split(new string[] { "\"" }, StringSplitOptions.None);

                    Attendance log = new Attendance(objDetail[3], Convert.ToDateTime(objDetail[1]), false, machine.MachineId, "1", machine.MachineIp, Convert.ToDateTime(objDetail[1]));

                    count++;

                    lb_total.Text = "Total " + count + "/" + totalrecord + "";

                    Console.WriteLine("{Total " + count + " / " + totalrecord + " }");
                    attendanceDAO.Add(log, connection);
                    progressBar1.Value = count;

                }
            }

        }

        public int GetTotal(string str5String)
        {
            // Regular expression pattern to match "total" attribute
            string pattern = @"total=""(\d+)""";

            // Use Regex.Match to find the match in the str5String
            Match match = Regex.Match(str5String, pattern);

            if (match.Success)
            {
                // Extract the "total" value from the match
                totalrecord = Convert.ToInt32(match.Groups[1].Value);

            }
            return totalrecord;
        }


        /// ////////////////////////////////////--------------- SYNC ATTENDANCE COMPLETE --------------------/////////////////////////


        private void UpdateUITask(string machineid, string machineid2)
        {
            // Use Invoke to safely update the UI controls from the main UI thread
            lblFrom.Text = "From - " + machineid.ToLower();
            lblTo.Text = "To - " + machineid2.ToLower();

        }
        int port;
        int Tomachineid;
        public void RunFaceTransferNedoToZkteco()
        {
            string fromip = cb_from.SelectedValue.ToString();
            string Toip = cb_to.SelectedValue.ToString();

            ConnectionClass ObjConnectionClass = new ConnectionClass();
            MySqlConnection connection;
            bool OpenConnection;

            List<string> responses = new List<string>();

            // Initialize();

            connection = ObjConnectionClass.Connection();
            OpenConnection = ObjConnectionClass.OpenConnection();

            if (OpenConnection == true)
            {
                AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();

                //List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", fromip);
                //foreach (var machine in machines)
                //{
                //    machineid1From = machine.MachineId;

                List<AttendanceMachine> machineFrom = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", fromip);
                foreach (var machine in machineFrom)
                {
                    //devInfo2 = GetDeviceInfo(machine.MachineIp, machine.PortNumber);

                    List<AttendanceMachine> machinTo = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", Toip);

                    foreach (var machineTo in machinTo)
                    {
                        port = machineTo.PortNumber;
                        int.TryParse(machineTo.MachineId, out Tomachineid);
                    }


                    List<string> selectedValues = new List<string>();

                    // Loop through each row in the DataGridView
                    foreach (DataGridViewRow row in gv.Rows)
                    {
                        // Check if the CheckBox in the first column is checked for the current row
                        DataGridViewCheckBoxCell checkBoxCell = row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell;
                        if (checkBoxCell.Value != null && (bool)checkBoxCell.Value)
                        {
                            // If the CheckBox is checked, get the value of the "AcNo" column (Employee ID)
                            string employeeId = row.Cells["AcNo"].Value.ToString();
                            selectedValues.Add(employeeId);
                        }
                    }

                    // Now, the selectedValues list contains the Employee IDs of the selected rows
                    // You can process this list as needed
                    foreach (string employeeId in selectedValues)
                    {
                        Console.WriteLine("Selected Employee ID: " + employeeId);
                        responses.AddRange(get_set_EmpFaceTemplateZkteco(employeeId, fromip, Convert.ToInt32(machine.MachineId), Toip, Tomachineid, port));
                      
                    }
                    if (selectedValues.Count == 0)
                    {
                        get_set_EmpFaceTemplateZkteco(employeeId, fromip, Convert.ToInt32(machine.MachineId), Toip, Tomachineid, port);
                        //MessageBox.Show("Completed");
                    }
                  
                }

              ObjConnectionClass.CloseConnection();
              MessageBox.Show("Completed");
            }
            btnReset_Click(null, null);


        }
        public void RunFaceTransfer()
        {
            string fromip = cb_fromMachine.SelectedValue.ToString();
            string Toip = cb_ToMachine.SelectedValue.ToString();

            ConnectionClass ObjConnectionClass = new ConnectionClass();
            MySqlConnection connection;
            bool OpenConnection;

            List<string> responses = new List<string>();


            // Initialize();

            connection = ObjConnectionClass.Connection();
            OpenConnection = ObjConnectionClass.OpenConnection();

            if (OpenConnection == true)
            {
                AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();

                //List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", fromip);
                //foreach (var machine in machines)
                //{
                //    machineid1From = machine.MachineId;

                List<AttendanceMachine> machines2 = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", Toip);
                foreach (var machine2 in machines2)
                {
                    devInfo2 = GetDeviceInfo(Toip, machine2.PortNumber);
                    machineid2 = machine2.MachineId;
                    machineid2To = machineid2;

                    //backgroundWorker.ReportProgress(0);

                    // }

                    List<string> selectedValues = new List<string>();

                    // Loop through each row in the DataGridView
                    foreach (DataGridViewRow row in GvEmpData.Rows)
                    {
                        // Check if the CheckBox in the first column is checked for the current row
                        DataGridViewCheckBoxCell checkBoxCell = row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell;
                        if (checkBoxCell.Value != null && (bool)checkBoxCell.Value)
                        {
                            // If the CheckBox is checked, get the value of the "AcNo" column (Employee ID)
                            string employeeId = row.Cells["AcNo"].Value.ToString();
                            selectedValues.Add(employeeId);
                        }
                    }

                    // Now, the selectedValues list contains the Employee IDs of the selected rows
                    // You can process this list as needed
                    foreach (string employeeId in selectedValues)
                    {
                        Console.WriteLine("Selected Employee ID: " + employeeId);
                        getEmpFaceTemplate(employeeId, Machine.MachineIp, Machine.PortNumber, Machine.MachineId, Toip, devInfo2, machineid2);
                    }
                }

                ObjConnectionClass.CloseConnection();
            }
            btnReset_Click(null, null);


        }
        public void getEmpFaceTemplate(string empid, string machineip, int portno, string machineID, string FaceSetInIP, string devInfo2, string machineid2)
        {

            string devInfo = GetDeviceInfo(machineip, portno);
            string str4 = "GetEmployee(id=\"" + empid + "\")";
            string str5 = "";
            uint num2 = 0;

            if (machineConnectivity.ExecuteCommad(devInfo, devInfo.Length, str4, str4.Length, ref str5, ref num2, myCallBack) != 0)
            {
                Console.WriteLine("Not Connected");
                MessageBox.Show("Machine not connected");
                return;
            }
            else
            {
                if (!str5.Contains("fail"))
                {
                    SetEmployeeInfo(myCallBack, str5, empid, devInfo2, machineid2);
                    count++;

                }
                else
                {
                    Console.WriteLine("Emp: " + empid + "---> Not transferred in  " + machineID + "");

                }
            }
        }



        bool Bconnect = false;
        int lenght = 0;
        string template;

        public List<string> get_set_EmpFaceTemplateZkteco(string empid, string fromIP, int fromID, string ToIP, int ToID, int port)
        {
            List<string> responses = new List<string>();
            Bconnect = axCZKEM1.Connect_Net(fromIP, port);
            axCZKEM1.EnableDevice(fromID, false); //disable the device

            if (Bconnect == true)
            {
                if (empid == "")
                {
                    //while (axCZKEM1.SSR_GetAllUserInfo(machineNumber, out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))
                    //{

                    //}

                }
                else
                {
                    if (axCZKEM1.GetUserFaceStr(fromID, empid, 50, ref template, ref lenght))
                    {

                        Bconnect = false;

                        Bconnect = axCZKEM1.Connect_Net(ToIP, port);
                        axCZKEM1.EnableDevice(ToID, false); //disable the device

                        if (Bconnect == true)
                        {
                            if (axCZKEM1.SSR_SetUserInfo(ToID, empid, "", "", 0, true))//upload user information to the memory   
                            {
                                bool getUserTmpExSuccess = axCZKEM1.SetUserFaceStr(ToID, (empid), 50, template, 0); // upload templates information to the device
                                if (getUserTmpExSuccess)
                                {
                                    responses.Add($"Emp : {empid} transferred");
                                    Console.WriteLine("");
                                }
                            }
                            axCZKEM1.EnableDevice(ToID, true);
                            axCZKEM1.RefreshData(ToID);//the data in the device should be refreshed
                            axCZKEM1.Disconnect();
                        }
                        else
                        {
                            responses.Add($"Machine {ToIP} not connected.");
                            Console.WriteLine($"Machine {ToIP} not connected.");
                        }
                        axCZKEM1.EnableDevice(fromID, true);                     
                        axCZKEM1.Disconnect();

                    }

                    else
                    {
                        // Handle failure to connect to the device
                        responses.Add($"Face template not availabel in {fromIP}.");

                    }
                }

            }
            else
            {
                responses.Add($"Machine {fromIP} not connected.");
                Console.WriteLine($"Machine {fromIP} not connected.");
            }
            return responses;
        }
        public List<string> SetEmployeeInfo(CallBack myCallBack, string str5, string empid, string devInfo2, string machineid)
        {
            string str4 = "";

            List<string> responses = new List<string>();

            string[] splitData = str5.Split('(');
            for (int i = 0; i < splitData.Length; i++)
            {
                string s = splitData[i];
                if (!s.Contains("Return"))
                {
                    string updatedData = s.Replace("result=\"success\" ", "");
                    string[] updatedResult = updatedData.Split(')');
                    str4 = "SetEmployee(" + updatedResult[0] + ")";

                    //str4 = str4.Substring(0, str4.Length - 1);
                    //str4 += str4 + " overwrite=\"true\")"; 
                }
            }
            str5 = "";
            uint num2 = 0;

            if (machineConnectivity.ExecuteCommad(devInfo2, devInfo2.Length, str4, str4.Length, ref str5, ref num2, myCallBack) != 0)
            {
                Console.WriteLine(str5);
                responses.Add("Machine not connected");

                MessageBox.Show("Machine not connected");
            }
            else
            {
                Console.WriteLine(str5);


                if (!str5.Contains("fail"))
                {

                    Console.WriteLine("Emp: " + empid + "---> transferred in  " + machineid + "");
                    responses.Add("Emp: " + empid + "---> transferred in  " + machineid + "");
                    backgroundWorker.ReportProgress(2, empid);

                    MessageBox.Show("Emp transferred");

                }
                else
                {
                    Console.WriteLine("Emp: " + empid + "---> Not transferred in  " + machineid + "");
                    responses.Add("Emp: " + empid + "---> Not transferred in  " + machineid + "");


                    MessageBox.Show("Emp not transferred");
                }
            }
            return responses;
        }


        public static string GetDeviceInfo(string machineIp, int portNumber)
        {
            return "DeviceInfo( dev_id = \"1\" dev_type = \"HW_HDCP\" comm_type = \"ip\" ip_address = \"" + machineIp + "\", password = \"\", port_number = \"" + portNumber + "\")";
        }
        private void BindSearchData(string searchText, int GridNo)
        {

            if (GridNo == 1)
            {
                GvEmpData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

                // Ensure that the search text is not empty
                if (string.IsNullOrWhiteSpace(searchText))
                {
                    // Reset the selection if the search text is empty
                    GvEmpData.ClearSelection();
                    return;
                }

                // Search for the row that matches the search text (case-insensitive)
                foreach (DataGridViewRow row in GvEmpData.Rows)
                {
                    // Ensure that the cell value is not null before comparing
                    if (row.Cells[1].Value != null && row.Cells[1].Value.ToString().Equals(searchText, StringComparison.OrdinalIgnoreCase))
                    {
                        row.Selected = true;
                        // Scroll to the selected row if needed
                        GvEmpData.FirstDisplayedScrollingRowIndex = row.Index;
                        return;
                    }
                }

                // If the search text is not found, clear the selection
                GvEmpData.ClearSelection();
            }
            if (GridNo == 2)
            {
                gv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

                // Ensure that the search text is not empty
                if (string.IsNullOrWhiteSpace(searchText))
                {
                    // Reset the selection if the search text is empty
                    gv.ClearSelection();
                    return;
                }

                // Search for the row that matches the search text (case-insensitive)
                foreach (DataGridViewRow row in gv.Rows)
                {
                    // Ensure that the cell value is not null before comparing
                    if (row.Cells[1].Value != null && row.Cells[1].Value.ToString().Equals(searchText, StringComparison.OrdinalIgnoreCase))
                    {
                        row.Selected = true;
                        // Scroll to the selected row if needed
                        gv.FirstDisplayedScrollingRowIndex = row.Index;
                        return;
                    }
                }

                // If the search text is not found, clear the selection
                gv.ClearSelection();
            }
            if (GridNo == 3)
            {
                gvZktecoData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

                // Ensure that the search text is not empty
                if (string.IsNullOrWhiteSpace(searchText))
                {
                    // Reset the selection if the search text is empty
                    gvZktecoData.ClearSelection();
                    return;
                }

                // Search for the row that matches the search text (case-insensitive)
                foreach (DataGridViewRow row in gvZktecoData.Rows)
                {
                    // Ensure that the cell value is not null before comparing
                    if (row.Cells[0].Value != null && row.Cells[0].Value.ToString().Equals(searchText, StringComparison.OrdinalIgnoreCase))
                    {
                        row.Selected = true;
                        // Scroll to the selected row if needed
                        gvZktecoData.FirstDisplayedScrollingRowIndex = row.Index;
                        return;
                    }
                }

                // If the search text is not found, clear the selection
                gvZktecoData.ClearSelection();
            }

            else
            {
                DataGvMachine.SelectionMode = DataGridViewSelectionMode.FullRowSelect;



                // Ensure that the search text is not empty
                if (string.IsNullOrWhiteSpace(searchText))
                {
                    // Reset the selection if the search text is empty
                    DataGvMachine.ClearSelection();
                    return;
                }

                // Search for the row that matches the search text (case-insensitive)
                foreach (DataGridViewRow row in DataGvMachine.Rows)
                {

                    // Ensure that the cell value is not null before comparing
                    if (row.Cells[1].Value != null && row.Cells[1].Value.ToString().Equals(searchText.ToString(), StringComparison.OrdinalIgnoreCase))
                    {
                        row.Selected = true;
                        // Scroll to the selected row if needed
                        DataGvMachine.FirstDisplayedScrollingRowIndex = row.Index;
                        return;
                    }

                }

                // If the search text is not found, clear the selection
                DataGvMachine.ClearSelection();

            }

        }
        private void bindDropDownMachineIp()
        {
            ConnectionClass ObjConnectionClass = new ConnectionClass();
            MySqlConnection connection;
            bool OpenConnection;

            connection = ObjConnectionClass.Connection();
            OpenConnection = ObjConnectionClass.OpenConnection();

            if (OpenConnection == true)
            {
                string query = "Select a.machine_ip , a.machine_name  , CONCAT(a.machine_name, '-', a.machine_ip) AS concatColumn from attendance_machine a where a.machine_status = 1 order by machine_id";
                MySqlCommand cmd = new MySqlCommand(query, connection);
                DataTable dataTable = new DataTable();
                MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter();
                mySqlDataAdapter.SelectCommand = cmd;
                mySqlDataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count > 0)
                {
                    // Create a new row with Id = 0
                    DataRow newRow = dataTable.NewRow();
                    newRow["concatColumn"] = "SELECT";

                    // Insert the new row at the 0 index
                    dataTable.Rows.InsertAt(newRow, 0);

                    // Clone the DataTable for each ComboBox
                    DataTable cbFromDataSource = dataTable.Clone();
                    DataTable cbToDataSource = dataTable.Clone();
                    DataTable cbMachineFromDataSource = dataTable.Clone();
                    DataTable cbMachineDataSource = dataTable.Clone();
                    DataTable cbMachIpDataSource = dataTable.Clone();
                    DataTable cbMachIpTurnstileDataSource = dataTable.Clone();
                    DataTable cbDataSource = dataTable.Clone();
                    DataTable cbtoDataSource = dataTable.Clone();
                    DataTable cb_zktecoDatasource = dataTable.Clone();


                    // Import the rows from the original DataTable to cloned DataTables
                    foreach (DataRow row in dataTable.Rows)
                    {
                        cbFromDataSource.ImportRow(row);
                        cbToDataSource.ImportRow(row);
                        cbMachineFromDataSource.ImportRow(row);
                        cbMachineDataSource.ImportRow(row);
                        cbMachIpDataSource.ImportRow(row);
                        cbMachIpTurnstileDataSource.ImportRow(row);
                        cbDataSource.ImportRow(row);
                        cbtoDataSource.ImportRow(row);
                        cb_zktecoDatasource.ImportRow(row);
                    }

                    cb_fromMachine.DataSource = cbFromDataSource;
                    cb_fromMachine.ValueMember = "machine_ip";
                    cb_fromMachine.DisplayMember = "concatColumn";

                    cb_ToMachine.DataSource = cbToDataSource;
                    cb_ToMachine.ValueMember = "machine_ip";
                    cb_ToMachine.DisplayMember = "concatColumn";

                    cb_machineFrom.DataSource = cbMachineFromDataSource;
                    cb_machineFrom.ValueMember = "machine_ip";
                    cb_machineFrom.DisplayMember = "concatColumn";


                    cbMachineIp.DataSource = cbMachineDataSource;
                    cbMachineIp.ValueMember = "machine_ip";
                    cbMachineIp.DisplayMember = "concatColumn";

                    cbMachIp.DataSource = cbMachIpDataSource;
                    cbMachIp.ValueMember = "machine_ip";
                    cbMachIp.DisplayMember = "concatColumn";

                    cb_machineIpTurnstile.DataSource = cbMachIpTurnstileDataSource;
                    cb_machineIpTurnstile.ValueMember = "machine_ip";
                    cb_machineIpTurnstile.DisplayMember = "concatColumn";


                    cb_from.DataSource = cbDataSource;
                    cb_from.ValueMember = "machine_ip";
                    cb_from.ValueMember = "machine_ip";
                    cb_from.DisplayMember = "concatColumn";

                    cb_to.DataSource = cbtoDataSource;
                    cb_to.DataSource = cbtoDataSource;
                    cb_to.ValueMember = "machine_ip";
                    cb_to.DisplayMember = "concatColumn";

                    cb_zkteco.DataSource = cb_zktecoDatasource;
                    cb_zkteco.ValueMember = "machine_ip";
                    cb_zkteco.DisplayMember = "concatColumn";

                    comboBox1.DataSource = cb_zktecoDatasource;
                    comboBox1.ValueMember = "machine_ip";
                    comboBox1.DisplayMember = "concatColumn";
                    

                }
            }
        }

        private void SetGridView2()
        {
            DataGvMachine.BackgroundColor = Color.White;
            DataGvMachine.RowHeadersVisible = false;
            DataGvMachine.AutoGenerateColumns = false;

            // Add a CheckBox Column to the DataGridView at the first position.
            DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
            checkBoxColumn.HeaderText = ""; // Set the header text for the CheckBox column
            checkBoxColumn.Width = 30;
            checkBoxColumn.Name = "checkBoxColumn";

            // Set the custom header cell to display the desired text and center align the text
            DataGridViewColumnHeaderCell headerCell = new DataGridViewColumnHeaderCell();
            headerCell.Value = "";
            headerCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            checkBoxColumn.HeaderCell = headerCell;

            DataGvMachine.Columns.Insert(0, checkBoxColumn);

            // Find the Location of Header Cell (using index 0).
            Point headerCellLocation = this.DataGvMachine.GetCellDisplayRectangle(0, -1, true).Location;

            // Initialize the header checkbox
            headerCheckBox2 = new CheckBox();
            headerCheckBox2.Size = new Size(15, 15);
            headerCheckBox2.BackColor = Color.Transparent;

            // Place the Header CheckBox in the Location of the Header Cell.
            headerCheckBox2.Location = new Point(headerCellLocation.X + (checkBoxColumn.Width / 2) - (headerCheckBox2.Width / 2), headerCellLocation.Y + 2);

            // Assign Click event to the Header CheckBox.
            headerCheckBox2.Click += new EventHandler(HeaderCheckBox_Clicked1);
            DataGvMachine.Controls.Add(headerCheckBox2);

            // Assign Click event to the DataGridView Cell.
            DataGvMachine.CellContentClick += new DataGridViewCellEventHandler(DataGvMachine_CellClick);

            // Add a new DataGridViewTextBoxColumn
            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "AcNo"; // Set DataPropertyName to "AcNo"
            column.HeaderText = "Employee ID"; // Set the header text for the column
            column.Name = "AcNo";

            // Add the column to the DataGridView
            DataGvMachine.Columns.Add(column);

            DataGvMachine.Visible = false;
        }
        private void SetGridView1()
        {
            GvEmpData.BackgroundColor = Color.White;
            GvEmpData.RowHeadersVisible = false;
            GvEmpData.AutoGenerateColumns = false;

            // Add a CheckBox Column to the DataGridView at the first position.
            DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
            checkBoxColumn.HeaderText = ""; // Set the header text for the CheckBox column
            checkBoxColumn.Width = 30;
            checkBoxColumn.Name = "checkBoxColumn";

            // Set the custom header cell to display the desired text and center align the text
            DataGridViewColumnHeaderCell headerCell = new DataGridViewColumnHeaderCell();
            headerCell.Value = "";
            headerCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            checkBoxColumn.HeaderCell = headerCell;

            GvEmpData.Columns.Insert(0, checkBoxColumn);

            // Find the Location of Header Cell (using index 0).
            Point headerCellLocation = this.GvEmpData.GetCellDisplayRectangle(0, -1, true).Location;

            // Initialize the header checkbox
            headerCheckBox3 = new CheckBox();
            headerCheckBox3.Size = new Size(15, 15);
            headerCheckBox3.BackColor = Color.Transparent;

            // Place the Header CheckBox in the Location of the Header Cell.
            headerCheckBox3.Location = new Point(headerCellLocation.X + (checkBoxColumn.Width / 2) - (headerCheckBox3.Width / 2), headerCellLocation.Y + 2);

            // Assign Click event to the Header CheckBox.
            headerCheckBox3.Click += new EventHandler(HeaderCheckBox_Clicked);
            GvEmpData.Controls.Add(headerCheckBox3);

            // Assign Click event to the DataGridView Cell.
            GvEmpData.CellContentClick += new DataGridViewCellEventHandler(GvEmpData_CellClick);

            // Add a new DataGridViewTextBoxColumn
            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "AcNo"; // Set DataPropertyName to "AcNo"
            column.HeaderText = "Employee ID"; // Set the header text for the column
            column.Name = "AcNo";

            // Add the column to the DataGridView
            GvEmpData.Columns.Add(column);

            GvEmpData.Visible = false;

        }

        private void SetGridView3()
        {
            gv.BackgroundColor = Color.White;
            gv.RowHeadersVisible = false;
            gv.AutoGenerateColumns = false;

            // Add a CheckBox Column to the DataGridView at the first position.
            DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
            checkBoxColumn.HeaderText = ""; // Set the header text for the CheckBox column
            checkBoxColumn.Width = 30;
            checkBoxColumn.Name = "checkBoxColumn";

            // Set the custom header cell to display the desired text and center align the text
            DataGridViewColumnHeaderCell headerCell = new DataGridViewColumnHeaderCell();
            headerCell.Value = "";
            headerCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            checkBoxColumn.HeaderCell = headerCell;

            gv.Columns.Insert(0, checkBoxColumn);

            // Find the Location of Header Cell (using index 0).
            Point headerCellLocation = this.gv.GetCellDisplayRectangle(0, -1, true).Location;

            // Initialize the header checkbox
            headerCheckBox = new CheckBox();
            headerCheckBox.Size = new Size(15, 15);
            headerCheckBox.BackColor = Color.Transparent;

            // Place the Header CheckBox in the Location of the Header Cell.
            headerCheckBox.Location = new Point(headerCellLocation.X + (checkBoxColumn.Width / 2) - (headerCheckBox.Width / 2), headerCellLocation.Y + 2);

            // Assign Click event to the Header CheckBox.
            headerCheckBox.Click += new EventHandler(GvHeaderCheckBox_Clicked);
            gv.Controls.Add(headerCheckBox);

            // Assign Click event to the DataGridView Cell.
            gv.CellContentClick += new DataGridViewCellEventHandler(gv_CellClick);

            // Add a new DataGridViewTextBoxColumn
            DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
            column.DataPropertyName = "AcNo"; // Set DataPropertyName to "AcNo"
            column.HeaderText = "Employee ID"; // Set the header text for the column
            column.Name = "AcNo";

            // Add the column to the DataGridView
            gv.Columns.Add(column);



        }

        private void showControls()
        {
            lblSearch.Visible = true;
            txtSearch.Visible = true;
            lbl_ip_to.Visible = true;
            cb_ToMachine.Visible = true;
            GvEmpData.Visible = true;
        }



        /////////////////////////////////////----------- BUTTONS & EVENTS -----------------------//////////////////////////////////////////

        private void btnGet_Click(object sender, EventArgs e)
        {
            showControls();

            if (cb_fromMachine.SelectedIndex > 0)
            {

                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;

                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)
                {


                    List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", cb_fromMachine.SelectedValue.ToString());
                    machineid1From = machines[0].MachineId;


                    Machine = new AttendanceMachine(machines[0].MachineId, cb_fromMachine.SelectedValue.ToString(), machines[0].PortNumber);

                    (List<Attendance> EmployeeList, int TotalCount) = attendanceMachineDAO.GetEmployees(connection, machineid1From);
                    backgroundWorker.ReportProgress(1, TotalCount);
                    // Set the EmployeeList as the DataSource
                    GvEmpData.DataSource = EmployeeList;

                    ObjConnectionClass.CloseConnection();
                }

            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }
        }

        private void txtSearch_TextChanged(object sender, EventArgs e)
        {
            string searchText = txtSearch.Text.Trim();
            BindSearchData(searchText, 1);
        }


        private void btnReset_Click(object sender, EventArgs e)
        {
            cb_machineFrom.SelectedIndex = 0;
            lb_total.Text = "Total";
            progressBar1.Value = 0;
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 0;
            count = 0;
            backgroundWorker.WorkerSupportsCancellation = true;
            if (backgroundWorker.IsBusy)
            {
                // Request cancellation of the task
                backgroundWorker.CancelAsync();
            }

            cb_fromMachine.SelectedIndex = 0;
            cb_ToMachine.SelectedIndex = 0;
            lblFrom.Text = "From:";
            lblTo.Text = "To:";
            lblResult.Text = "Emp no :";
            lblTotalEmp.Text = "Total Emp :";

            GvEmpData.DataSource = null;
            GvEmpData.Visible = false;

            lbl_ip_to.Visible = false;
            cb_ToMachine.Visible = false;
            lblSearch.Visible = false;
            txtSearch.Visible = false;
            cb_machineFrom.SelectedIndex = 0;
            txtSearch.Text = "";

            tb_emp.Text = "";
            GvRegisteredUsers.DataSource = null;
            DataGvMachine.DataSource = null;

            GvFaceTemplate.DataSource = null;
            txtEmpoyeeCd.Text = null;
            cbMachIp.SelectedIndex = 0;

        }
        private void Btn_Transfer_Click(object sender, EventArgs e)
        {

            if (cb_fromMachine.SelectedIndex > 0 && cb_ToMachine.SelectedIndex > 0)
            {
                //backgroundWorker.RunWorkerAsync();

                RunFaceTransfer();

            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }

        }

        private void btnGetRecord_Click(object sender, EventArgs e)
        {

            DataGvMachine.Visible = true;

            if (comboBox1.SelectedIndex > 0)
            {

                //DataGvMachine.Rows.Clear();
                lbl_totalemp.Text = "";
                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;

                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)
                {
                    AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();

                    List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", comboBox1.SelectedValue.ToString());
                    Machine = new AttendanceMachine(machines[0].MachineId, comboBox1.SelectedValue.ToString(), machines[0].PortNumber);
                    // backgroundWorker.ReportProgress(1, TotalCount);


                    string devInfo = GetDeviceInfo(machines[0].MachineIp, machines[0].PortNumber);
                    string str4 = "GetEmployeeID()";
                    string str5 = "";
                    uint num2 = 0;

                    if (machineConnectivity.ExecuteCommad(devInfo, devInfo.Length, str4, str4.Length, ref str5, ref num2, myCallBack) != 0)
                    {
                        Console.WriteLine("Not Connected");
                        MessageBox.Show("Machine not connected");
                    }
                    else
                    {
                        if (!str5.Contains("fail"))
                        {

                            ConvertData(str5);


                        }
                        else
                        {

                        }
                    }



                    ObjConnectionClass.CloseConnection();
                }

            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }
        }

        private void ConvertData(string str5)
        {

            DataTable dt = new DataTable();
            dt.Columns.Add("AcNo", typeof(string));


            string[] keyValuePairs = str5.Split(new char[] { ',', '=' }, StringSplitOptions.RemoveEmptyEntries);

            // Create a list to store the extracted values
            List<string> values = new List<string>();

            foreach (string keyValue in keyValuePairs)
            {
                // Find the index of the first occurrence of '"'
                int startIdx = keyValue.IndexOf('"');

                // Find the index of the last occurrence of '"'
                int endIdx = keyValue.LastIndexOf('"');

                // Extract the value between the '"' characters
                if (startIdx != -1 && endIdx != -1 && startIdx < endIdx)
                {
                    string value = keyValue.Substring(startIdx + 1, endIdx - startIdx - 1);
                    values.Add(value);
                }
            }

            if (values.Count > 0)
            {
                // The first value is the total employee count
                lbl_totalemp.Text = "Total Emp: " + values[1].ToString();
                foreach (string value in values)
                {
                    if (value != "success" && value != values[1])
                    {
                        //DataGvMachine.Rows.Add(value);
                        dt.Rows.Add(value);
                    }
                }

            }


            SortDataGridView(dt);
            //DataGvMachine.DataSource = dt;
        }


        private void SortDataGridView(DataTable dt)
        {
            // Assuming you have populated the data source for DataGvMachine
            // and the data source is a DataTable named "dataSourceTable"

            // Assuming "serial_number" column is in the first position (index 0)
            if (dt.Rows.Count > 0)
            {
                // Custom sorting by converting "serial_number" to unsigned integer
                var sortedRows = dt.AsEnumerable()
                    .OrderBy(row => Convert.ToUInt64(row["AcNo"]))
                    .CopyToDataTable();

                // Bind the sorted data to the DataGridView
                DataGvMachine.DataSource = sortedRows;
            }
        }
        private void txt_search2_TextChanged(object sender, EventArgs e)
        {
            string searchText = txt_search2.Text.Trim();
            BindSearchData(searchText, 0);
        }

        string employeeId;
        private void GetTemplateSaveInMachine()
        {
            SaveTemplate saveTemplate = new SaveTemplate();

            string fromip = cbMachineIp.SelectedValue.ToString();

            ConnectionClass ObjConnectionClass = new ConnectionClass();
            MySqlConnection connection;
            bool OpenConnection;

            List<string> responses = new List<string>();


            // Initialize();

            connection = ObjConnectionClass.Connection();
            OpenConnection = ObjConnectionClass.OpenConnection();

            if (OpenConnection == true)
            {
                string devInfo = GetDeviceInfo(fromip, Machine.PortNumber);
                foreach (DataGridViewRow row in DataGvMachine.Rows)
                {
                    // Check if the CheckBox in the first column is checked for the current row
                    DataGridViewCheckBoxCell checkBoxCell = row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell;
                    if (checkBoxCell.Value != null && (bool)checkBoxCell.Value)
                    {
                        // If the CheckBox is checked, get the value of the "AcNo" column (Employee ID)
                        employeeId = row.Cells["AcNo"].Value.ToString();

                        string str4 = "GetEmployee(id=\"" + employeeId + "\")";
                        string machineResponse = "";
                        uint num2 = 0;

                        if (machineConnectivity.ExecuteCommad(devInfo, devInfo.Length, str4, str4.Length, ref machineResponse, ref num2, myCallBack) != 0)
                        {
                            Console.WriteLine("Not Connected");
                            return;
                        }
                        else
                        {
                            if (!machineResponse.Contains("fail"))
                            {
                                str4 = removeReturn(machineResponse);
                                saveTemplate.CheckInDb(connection, employeeId, str4);
                            }
                            else
                            {
                                Console.WriteLine("Template not saved");

                            }

                        }
                    }
                }
            }

        }
        private string removeReturn(string str5)
        {
            string str4 = null;
            string[] splitData = str5.Split('(');
            for (int i = 0; i < splitData.Length; i++)
            {
                string s = splitData[i];
                if (!s.Contains("Return"))
                {
                    string updatedData = s.Replace("result=\"success\" ", "");
                    string[] updatedResult = updatedData.Split(')');
                    str4 = updatedResult[0];

                }
            }
            return str4;
        }
        private void SepratetemplateFromStr5()
        {
            //string searchStr = "face_data=\"";
            //int currentIndex = 0;

            //while (true)
            //{
            //    int startIndex = str5.IndexOf(searchStr, currentIndex);
            //    if (startIndex == -1)
            //    {
            //        break;
            //    }
            //    startIndex += searchStr.Length;

            //    int endIndex = str5.IndexOf("\"", startIndex);
            //    if (endIndex == -1)
            //    {
            //        break;
            //    }

            //    string faceData = str5.Substring(startIndex, endIndex - startIndex);
            //    Console.WriteLine(faceData);

            //    currentIndex = endIndex + 1;
            //}

        }

        private string GetBlobValue(String empid)
        {
            string stringValue = null;
            ConnectionClass ObjConnectionClass = new ConnectionClass();
            MySqlConnection connection;
            bool OpenConnection;

            connection = ObjConnectionClass.Connection();
            OpenConnection = ObjConnectionClass.OpenConnection();

            if (OpenConnection == true)
            {

                string query = "SELECT template FROM attendance_machine_face_templates WHERE serial_no = @RecordId";
                using (MySqlCommand command = new MySqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@RecordId", empid);

                    using (MySqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            // Assuming blob_data is of type varbinary(max)
                            byte[] blobValue = (byte[])reader["template"];
                            stringValue = Encoding.UTF8.GetString(blobValue);
                            // Use the blobValue byte array as needed
                            //Console.WriteLine($"Retrieved BLOB value of length: {stringValue}");
                        }
                        else
                        {
                            Console.WriteLine("No matching record found.");
                        }
                    }
                }
            }
            return stringValue;
        }

        private void btn_result_Click(object sender, EventArgs e)
        {
            DataTable dataTable = new DataTable();
            if (tb_emp.Text.Length > 0)
            {
                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;
                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)
                {

                    RegisteredUsers registeredUsers = new RegisteredUsers();
                    dataTable = registeredUsers.Registered_Users(tb_emp.Text, connection);
                    GvRegisteredUsers.DataSource = dataTable;
                }
            }
        }

        private void btnSaveDb_Click(object sender, EventArgs e)
        {
            if (cbMachineIp.SelectedIndex > 0)
            {
                GetTemplateSaveInMachine();
                MessageBox.Show("DONE");
            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }
        }

        private void DataGvMachine_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //Check to ensure that the row CheckBox is clicked.
            if (e.RowIndex >= 0 && e.ColumnIndex == 0)
            {
                //Loop to verify whether all row CheckBoxes are checked or not.
                bool isChecked = true;
                foreach (DataGridViewRow row in DataGvMachine.Rows)
                {
                    if (Convert.ToBoolean(row.Cells["checkBoxColumn"].EditedFormattedValue) == false)
                    {
                        isChecked = false;
                        break;
                    }
                }
                headerCheckBox2.Checked = isChecked;
            }
        }
        private void HeaderCheckBox_Clicked1(object sender, EventArgs e)
        {
            //Necessary to end the edit mode of the Cell.
            DataGvMachine.EndEdit();

            //Loop and check and uncheck all row CheckBoxes based on Header Cell CheckBox.
            foreach (DataGridViewRow row in DataGvMachine.Rows)
            {
                DataGridViewCheckBoxCell checkBox = (row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell);
                checkBox.Value = headerCheckBox2.Checked;
            }
        }
        private void GvEmpData_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //Check to ensure that the row CheckBox is clicked.
            if (e.RowIndex >= 0 && e.ColumnIndex == 0)
            {
                //Loop to verify whether all row CheckBoxes are checked or not.
                bool isChecked = true;
                foreach (DataGridViewRow row in GvEmpData.Rows)
                {
                    if (Convert.ToBoolean(row.Cells["checkBoxColumn"].EditedFormattedValue) == false)
                    {
                        isChecked = false;
                        break;
                    }
                }
                headerCheckBox.Checked = isChecked;
            }
        }
        private void gv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //Check to ensure that the row CheckBox is clicked.
            if (e.RowIndex >= 0 && e.ColumnIndex == 0)
            {
                //Loop to verify whether all row CheckBoxes are checked or not.
                bool isChecked = true;
                foreach (DataGridViewRow row in GvEmpData.Rows)
                {
                    if (Convert.ToBoolean(row.Cells["checkBoxColumn"].EditedFormattedValue) == false)
                    {
                        isChecked = false;
                        break;
                    }
                }
                headerCheckBox.Checked = isChecked;
            }
        }

        private void GvHeaderCheckBox_Clicked(object sender, EventArgs e)
        {
            //Necessary to end the edit mode of the Cell.
            gv.EndEdit();

            //Loop and check and uncheck all row CheckBoxes based on Header Cell CheckBox.
            foreach (DataGridViewRow row in gv.Rows)
            {
                DataGridViewCheckBoxCell checkBox = (row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell);
                checkBox.Value = headerCheckBox.Checked;
            }
        }


        private void HeaderCheckBox_Clicked(object sender, EventArgs e)
        {
            //Necessary to end the edit mode of the Cell.
            GvEmpData.EndEdit();

            //Loop and check and uncheck all row CheckBoxes based on Header Cell CheckBox.
            foreach (DataGridViewRow row in GvEmpData.Rows)
            {
                DataGridViewCheckBoxCell checkBox = (row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell);
                checkBox.Value = headerCheckBox3.Checked;
            }
        }
        private void btmGetTemplate_Click(object sender, EventArgs e)
        {
            try
            {

                List<string> Response = new List<string>();
                if (txtEmpoyeeCd.Text.Length > 0 && cbMachIp.SelectedIndex > 0)
                {
                    if (dataTableFaceTemplates.Rows.Count > 0)
                    {

                        ConnectionClass ObjConnectionClass = new ConnectionClass();
                        MySqlConnection connection;
                        bool OpenConnection;
                        connection = ObjConnectionClass.Connection();


                        OpenConnection = ObjConnectionClass.OpenConnection();

                        if (OpenConnection == true)
                        {
                            List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", cbMachIp.SelectedValue.ToString());
                            Machine = new AttendanceMachine(machines[0].MachineId, cbMachIp.SelectedValue.ToString(), machines[0].PortNumber);
                            devInfo2 = GetDeviceInfo(Machine.MachineIp, Machine.PortNumber);

                            if (dataTableFaceTemplates.Rows.Count > 0)
                            {


                                // Fetch and populate the blob data into the "BlobDataBytes" column
                                foreach (DataRow row in dataTableFaceTemplates.Rows)
                                {

                                    byte[] blobValue = (byte[])row["template"];
                                    string stringValue = Encoding.UTF8.GetString(blobValue);
                                    string emp = row["serial_no"].ToString();
                                    Response.AddRange(SetEmployeeInfo(myCallBack, stringValue, emp, devInfo2, Machine.MachineId));
                                }
                                // Add each response to the StringBuilder
                                foreach (string response in Response)
                                {
                                    responseStringBuilder.AppendLine(response);
                                }

                                string allResponses = responseStringBuilder.ToString();

                                // Display all responses in a message box
                                MessageBox.Show(allResponses);
                                responseStringBuilder.Clear();
                            }
                            else
                            {
                                GvFaceTemplate.DataSource = null;
                                txtEmpoyeeCd.Text = null;
                                cbMachIp.SelectedIndex = 0;
                                MessageBox.Show("Template of - " + txtEmpoyeeCd.Text + " - not found in db");
                            }

                        }
                    }
                    else
                    {
                        MessageBox.Show("Invalid employee code");
                    }
                }
                else
                {
                    MessageBox.Show("Please provide employee code");

                }
            }
            catch (Exception ex)
            {

            }
        }


        private void btnAllow_Click(object sender, EventArgs e)
        {
            if (DataGvMachine.Rows.Count > 1)
            {
                string fromip = cbMachineIp.SelectedValue.ToString();

                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;

                List<string> responses = new List<string>();


                // Initialize();

                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)

                {
                    List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", fromip);
                    Machine = new AttendanceMachine(machines[0].MachineId, cbMachIp.SelectedValue.ToString(), machines[0].PortNumber);

                    string devInfo = GetDeviceInfo(fromip, Machine.PortNumber);
                    foreach (DataGridViewRow row in DataGvMachine.Rows)
                    {
                        // Check if the CheckBox in the first column is checked for the current row
                        DataGridViewCheckBoxCell checkBoxCell = row.Cells["checkBoxColumn"] as DataGridViewCheckBoxCell;
                        if (checkBoxCell.Value != null && (bool)checkBoxCell.Value)
                        {
                            // If the CheckBox is checked, get the value of the "AcNo" column (Employee ID)
                            employeeId = row.Cells["AcNo"].Value?.ToString();

                            string str4 = "GetEmployee(id=\"" + employeeId + "\")";
                            string machineResponse = "";
                            uint num2 = 0;

                            if (machineConnectivity.ExecuteCommad(devInfo, devInfo.Length, str4, str4.Length, ref machineResponse, ref num2, myCallBack) != 0)
                            {
                                Console.WriteLine("Not Connected");
                                return;
                            }
                            else
                            {
                                if (!machineResponse.Contains("fail"))
                                {
                                    str4 = removeReturn(machineResponse);
                                    //Check turnstile is allow or not
                                    AllowturnstileAccess(str4, employeeId, devInfo, Machine.MachineId);

                                    //saveTemplate.CheckInDb(connection, employeeId, str4);
                                }
                                else
                                {
                                    Console.WriteLine("Template not saved");

                                }

                            }
                        }
                    }
                }

            }
            else
            {
                MessageBox.Show("Please get machine data first");
            }
        }

        private void AllowturnstileAccess(string value, string empid, string devInfo, string machineid)
        {
            if (!value.Contains("authority=\"0X11\""))
            {
                string pattern = @"authority\s*=\s*""0X55""";

                // Define the replacement value
                string replacement = "authority=\"0X11\"";

                // Use Regex.Replace to perform the replacement
                string modifiedValue = Regex.Replace(value, pattern, replacement);

                SetEmployeeInfo(myCallBack, modifiedValue, empid, devInfo, machineid);
            }
            else
            {
                Console.WriteLine("Turnstile access already allowed");

            }
        }

        private void btn_logout_Click(object sender, EventArgs e)
        {
            this.Hide();
            LoginForm loginForm = new LoginForm();
            loginForm.Show();
            File.Delete(filePath);
        }
        DataTable dataTableFaceTemplates = new DataTable();
        private void btn_getFaceTemplates_Click(object sender, EventArgs e)
        {
            //GetBlobValue(txtEmpoyeeCd.Text);

            if (txtEmpoyeeCd.Text.Length > 0)
            {
                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;
                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)
                {
                    RegisteredUsers registeredUsers = new RegisteredUsers();

                    dataTableFaceTemplates = registeredUsers.GetFaceTemplates(connection, txtEmpoyeeCd.Text);

                    dataTableFaceTemplates.Columns.Add("Face", typeof(string));
                    // Set the DataGridView's DataSource to the modified dataTableFaceTemplates
                    GvFaceTemplate.DataSource = dataTableFaceTemplates;
                    GvFaceTemplate.Columns["template"].Visible = false;
                    foreach (DataRow row in dataTableFaceTemplates.Rows)
                    {
                        row["Face"] = "Yes";
                    }
                }
            }
            else
            {
                // Handle the case where txtEmpoyeeCd.Text is empty
            }
        }

        private void btn_get_face_Click(object sender, EventArgs e)
        {

            if (cb_from.SelectedIndex > 0)
            {
                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;

                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)
                {
                    List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", cb_from.SelectedValue.ToString());
                    machineid1From = machines[0].MachineId;

                    Machine = new AttendanceMachine(machines[0].MachineId, cb_fromMachine.SelectedValue.ToString(), machines[0].PortNumber);

                    (List<Attendance> EmployeeList, int TotalCount) = attendanceMachineDAO.GetEmployees(connection, machineid1From);

                    // Set the EmployeeList as the DataSource
                    gv.DataSource = EmployeeList;

                    ObjConnectionClass.CloseConnection();
                }

            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }
        }

        private void txtSearchNew_TextChanged(object sender, EventArgs e)
        {
            string searchText = txtSearchNew.Text.Trim();
            BindSearchData(searchText, 2);
        }

        private void btn_transferNew_Click(object sender, EventArgs e)
        {
            if (cb_to.SelectedIndex > 0 && cb_from.SelectedIndex > 0)
            {
                //backgroundWorker.RunWorkerAsync();

                RunFaceTransferNedoToZkteco();

            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }

        }

        private void btn_livedata_get_Click(object sender, EventArgs e)
        {
            if (cb_zkteco.SelectedIndex > 0)
            {
                //DataGvMachine.Rows.Clear();
                lbl_totalemp.Text = "";
                ConnectionClass ObjConnectionClass = new ConnectionClass();
                MySqlConnection connection;
                bool OpenConnection;

                connection = ObjConnectionClass.Connection();
                OpenConnection = ObjConnectionClass.OpenConnection();

                if (OpenConnection == true)
                {
                    AttendanceMachineDAO attendanceMachineDAO = new AttendanceMachineDAO();
                    DataTable dataTable = new DataTable();
                    dataTable.Columns.Add("Serial_no", typeof(string));
                    List<AttendanceMachine> machines = attendanceMachineDAO.getAttendanceMachineDetails(connection, "0", cb_zkteco.SelectedValue.ToString());
                    Machine = new AttendanceMachine(machines[0].MachineId, cb_zkteco.SelectedValue.ToString(), machines[0].PortNumber);
                    // backgroundWorker.ReportProgress(1, TotalCount);

                    Bconnect = axCZKEM1.Connect_Net(Machine.MachineIp, Machine.PortNumber);
                    axCZKEM1.EnableDevice(Convert.ToInt32(Machine.MachineId), false); //disable the device

                    if (Bconnect == true)
                    {
                        string sdwEnrollNumber = string.Empty, sName = string.Empty, sPassword = string.Empty;
                        int iPrivilege = 0, iFaceIndex = 0, iFlag = 0, iTmpLength = 0;
                        bool bEnabled = false;
                        axCZKEM1.ReadAllTemplate(Convert.ToInt32(Machine.MachineId));
                       
                        while (axCZKEM1.SSR_GetAllUserInfo(Convert.ToInt32(Machine.MachineId), out sdwEnrollNumber, out sName, out sPassword, out iPrivilege, out bEnabled))
                        {
                            // Create a new DataRow
                            DataRow newRow = dataTable.NewRow();

                            // Set the value of the "EnrollNumber" column
                            newRow["Serial_no"] = sdwEnrollNumber;

                            // Add the new row to the DataTable
                            dataTable.Rows.Add(newRow);
                        }
                        txt_total.Text =  "Total Emp:"+ dataTable.Rows.Count;
                    }
                    axCZKEM1.EnableDevice(Convert.ToInt32(Machine.MachineId), true);                  
                    axCZKEM1.Disconnect();
                    gvZktecoData.DataSource = dataTable;
                    ObjConnectionClass.CloseConnection();
                }

            }
            else
            {
                MessageBox.Show("Please provide proper machine ip's");
            }
        }

        private void txt_searchZkteco_TextChanged(object sender, EventArgs e)
        {
            string searchText = txt_searchZkteco.Text.Trim();
            BindSearchData(searchText, 3);
        }
    }

}
