using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Bt;
using CsvReadWrite;
using System.Threading;
using Bt.FileLib;
using Bt.SysLib;
using System.IO;
using System.Runtime.InteropServices;
using Bt.CommLib;

namespace HT_SKT_Stock
{
    public partial class Form_DS : Form
    {
        public static Form_DS _FormInstance;		// フォーム
        public String AppPath = "";						// アプリケーション実行パス
        public String dbFilePath = "\\FlashDisk\\BT_FILES\\drv1\\SKT_Stock\\HT_SKT.DB";
        public int dbIdx = 0;
        public int recordCount = 0;

        public Form_DS()
        {
            InitializeComponent();
        }

        private void Form_DS_Load(object sender, EventArgs e)
        {
            // 画面サイズ調整
            if (System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width == 240)
            {
                resolution.ScreenSize.VGAtoQVGA(this);
            }

            // フォームの最大化・最小化ボタン非表示
            this.MaximizeBox = !this.MaximizeBox;
            this.MinimizeBox = !this.MinimizeBox;

            _FormInstance = this;


            // 実行パスを取得
            String path = this.GetType().Assembly.GetModules()[0].FullyQualifiedName;
            Int32 en = path.LastIndexOf("\\");
            AppPath = path.Substring(0, en);
            Bt.ScanLib.Control.btScanDisable();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            int ret = outputCSVFile(dbFilePath, "\\FlashDisk\\BT_FILES\\drv1\\log\\");

                 KP_Connect();
                 KP_SendLogFile("\\FlashDisk\\BT_FILES\\drv1\\log\\" + FrmLogin._Form_LoginInstance.DevNO + "_Record_KB" + DateTime.Now.ToString("yyMMdd") + ".csv", FrmLogin._Form_LoginInstance.DevNO + "_Record_KB" + DateTime.Now.ToString("yyMMdd") + ".csv");
                 KP_SendLogFile("\\FlashDisk\\BT_FILES\\drv1\\log\\" + FrmLogin._Form_LoginInstance.DevNO + "_Record_PDS" + DateTime.Now.ToString("yyMMdd") + ".csv", FrmLogin._Form_LoginInstance.DevNO + "_Record_PDS" + DateTime.Now.ToString("yyMMdd") + ".csv");
                 KP_Disconnect();

            Form frmD = new Success();

            frmD.ShowDialog();
            frmD.Dispose();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Form_Menu._Form_MenuInstance.Show();

            FrmPOKAYOKEMatching._Form_POKAYOKEMatchingInstance.Show();
            
            //this.Hide();
            this.Close();
        }

        /////////////////////////////////////////////////////////////
        /// Open
        /////////////////////////////////////////////////////////////
        private int openDB()
        {
            if (dbIdx > 0) return -1;
            dbIdx = Bt.FileLib.SQLite.btSQLiteOpen(new StringBuilder(dbFilePath));
            if (dbIdx > 0)
            {
                return 0;
            }
            else
            {

                return -1;
            }
        }

        /////////////////////////////////////////////////////////////
        /// Close
        /////////////////////////////////////////////////////////////
        private int closeDB()
        {
            if (dbIdx <= 0) return -1;
            int ret = Bt.FileLib.SQLite.btSQLiteClose(dbIdx);
            dbIdx = 0;
            if (ret == 0)
            {

                return 0;
            }
            else
            {

                return -1;
            }
        }



        


        /////////////////////////////////////////////////////////////
        /// CSV output
        /////////////////////////////////////////////////////////////
        private int outputCSVFile(string dbFileName, string outputPath)
        {
            int retcode = -1;
            int cIdx = 0;
            int cIdx2 = 0;
            int dbIdx = Bt.FileLib.SQLite.btSQLiteOpen(new StringBuilder(dbFilePath));
            if (dbIdx <= 0) return retcode;
            IntPtr data;
            data = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(Char)) * (8192 + 1));
            string sep = ",";

            StringBuilder sql = new StringBuilder("SELECT name FROM sqlite_master WHERE type = 'table';");
            cIdx = Bt.FileLib.SQLite.btSQLiteCmdCreate(dbIdx);
            if (cIdx <= 0) goto FUNCEND;
            int ret = Bt.FileLib.SQLite.btSQLiteCmdSetCommandText(cIdx, sql);
            if (ret < 0) goto FUNCEND;
            ret = Bt.FileLib.SQLite.btSQLiteCmdExecuteReader(cIdx);
            if (ret < 0) goto FUNCEND;

            int read_ret = 0;
            do
            {
                read_ret = Bt.FileLib.SQLite.btSQLiteCmdRead(cIdx);
                if (read_ret < 0) goto FUNCEND;
                else if (read_ret == 1)
                {
                    ret = Bt.FileLib.SQLite.btSQLiteCmdGetValue(cIdx, 0, data, 8192);
                    if (ret != 0) goto FUNCEND;
                    string tableName = Marshal.PtrToStringUni(data);

                    sql = new StringBuilder("SELECT * FROM " + tableName + ";");
                    cIdx2 = Bt.FileLib.SQLite.btSQLiteCmdCreate(dbIdx);
                    if (cIdx2 <= 0) goto FUNCEND;
                    ret = Bt.FileLib.SQLite.btSQLiteCmdSetCommandText(cIdx2, sql);
                    if (ret < 0) goto FUNCEND;
                    ret = Bt.FileLib.SQLite.btSQLiteCmdExecuteReader(cIdx2);
                    if (ret < 0) goto FUNCEND;

                    System.IO.StreamWriter writer = null;
                    try
                    {
                        writer = new System.IO.StreamWriter(outputPath + FrmLogin._Form_LoginInstance.DevNO + "_" + tableName + DateTime.Now.ToString("yyMMdd") + ".csv", false, System.Text.Encoding.GetEncoding("Shift_JIS"));
                        do
                        {
                            ret = Bt.FileLib.SQLite.btSQLiteCmdRead(cIdx2);
                            if (ret < 0) goto FUNCEND;
                            else if (ret == 1)
                            {
                                StringBuilder line = new StringBuilder("");
                                int cnt = Bt.FileLib.SQLite.btSQLiteCmdGetValueCount(cIdx2);
                                for (int i = 0; i < cnt; i++)
                                {
                                    if (line.ToString() != "") line.Append(sep);
                                    Bt.FileLib.SQLite.btSQLiteCmdGetValue(cIdx2, i, data, 8192);
                                    line.Append("\"" + Marshal.PtrToStringUni(data) + "\"");
                                }
                                writer.WriteLine(line);
                            }
                        } while (ret == 1);
                    }
                    finally
                    {
                        if (writer != null) writer.Close();
                    }
                }
            } while (read_ret == 1);

            retcode = 0;

        FUNCEND:
            if (cIdx > 0) Bt.FileLib.SQLite.btSQLiteCmdDelete(dbIdx);
            if (cIdx2 > 0) Bt.FileLib.SQLite.btSQLiteCmdDelete(cIdx2);
            Marshal.FreeCoTaskMem(data);
            if (dbIdx > 0) Bt.FileLib.SQLite.btSQLiteClose(dbIdx);
            return retcode;
        }


        /********************************************************************************
        * 機能 ：クライアントからの要求を待ちます（キーエンス手順）
        * API  ：btCommListen
        ********************************************************************************/
        private void btn_KPListen_Click(object sender, EventArgs e)
        {
            Int32 ret = 0;
            String disp = "";
            StringBuilder filenameSet = new StringBuilder("");

            try
            {
                filenameSet = new StringBuilder(AppPath + "\\KPListen.txt");

                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommListen(10, LibDef.BT_VK_CLR, filenameSet);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommListen error ret[" + ret + "]";
                   // MessageBox.Show(disp, "エラー");
                    return;
                }
                disp = "サーバとの接続が解除されました。\r\n";
               // MessageBox.Show(disp, "接続解除（キーエンス手順）");
            }
            catch (Exception ex)
            {
              //  MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバと接続します（キーエンス手順）
         * API  ：btCommConnect
        ********************************************************************************/
        private void KP_Connect()
        {
            Int32 ret = 0;
            String disp = "";

            try
            {
                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommConnect(10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommConnect error ret[" + ret + "]";
                    MessageBox.Show(disp, "Error");
                    return;
                }
                //disp = "サーバと接続しました。\r\n";
                //MessageBox.Show(disp, "接続（キーエンス手順）");
            }
            catch (Exception ex)
            {
              //  MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバとの接続を解除します（キーエンス手順）
         * API  ：btCommDisconnect
        ********************************************************************************/
        private void KP_Disconnect()
        {
            Int32 ret = 0;
            String disp = "";

            try
            {
                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommDisconnect(10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommDisconnect error ret[" + ret + "]";
                   MessageBox.Show(disp, "Error");
                    return;
                }
                //disp = "サーバとの接続を解除しました。\r\n";
                //MessageBox.Show(disp, "切断（キーエンス手順）");
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバへファイル送信します（キーエンス手順）
         * API  ：btCommPutFile
        ********************************************************************************/
        private void KP_SendLogFile(string lf, string rf)
        {
            Int32 ret = 0;
            String disp = "";
            StringBuilder localFile = new StringBuilder("");
            StringBuilder remoteFile = new StringBuilder("");
            bool overWrite = true;
            bool createFolder = true;

            try
            {
                localFile = new StringBuilder(lf);
                remoteFile = new StringBuilder(rf);

                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommPutFile(localFile, remoteFile, overWrite, createFolder, 10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommPutFile error ret[" + ret + "]";
                   MessageBox.Show(disp, "Error");
                    return;
                }
                //disp = "ファイルを送信しました。\r\n";
                //MessageBox.Show(disp, "ファイル送信（キーエンス手順）");
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバからファイルを受信します（キーエンス手順）
         * API  ：btCommGetFile
        ********************************************************************************/
        private void btn_KPRecv_Click(object sender, EventArgs e)
        {
            Int32 ret = 0;
            String disp = "";
            StringBuilder localFile = new StringBuilder("");
            StringBuilder remoteFile = new StringBuilder("");

            try
            {
                localFile = new StringBuilder(AppPath + "\\KPRecvLocal.dat");
                remoteFile = new StringBuilder("KPRecvRemote.dat");

                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommGetFile(remoteFile, localFile, 10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommGetFile error ret[" + ret + "]";
                   MessageBox.Show(disp, "Error");
                    return;
                }
                disp = "ファイルを受信しました。\r\n";
               // MessageBox.Show(disp, "ファイル受信（キーエンス手順）");
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバのファイル名を変更します（キーエンス手順）
         * API  ：btCommRenameFile
        ********************************************************************************/
        private void btn_KPFileRename_Click(object sender, EventArgs e)
        {
            Int32 ret = 0;
            String disp = "";
            StringBuilder oldFile = new StringBuilder("");
            StringBuilder newFile = new StringBuilder("");

            try
            {
                oldFile = new StringBuilder("KPRenameOld.dat");
                newFile = new StringBuilder("KPRenameNew.dat");

                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommRenameFile(oldFile, newFile, 10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommRenameFile error ret[" + ret + "]";
                   // MessageBox.Show(disp, "エラー");
                    return;
                }
                disp = "サーバ側のファイル名を変更しました。\r\n";
               // MessageBox.Show(disp, "ファイル名変更（キーエンス手順）");
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバのファイルを削除します（キーエンス手順）
         * API  ：btCommRemoveFile
        ********************************************************************************/
        private void btn_KPFileDelete_Click(object sender, EventArgs e)
        {
            Int32 ret = 0;
            String disp = "";
            StringBuilder remoteFile = new StringBuilder("");

            try
            {
                remoteFile = new StringBuilder("KPRemote.dat");

                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommRemoveFile(remoteFile, 10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommRemoveFile error ret[" + ret + "]";
                    MessageBox.Show(disp, "Error");
                    return;
                }
                disp = "サーバ側のファイルを削除しました。\r\n";
               // MessageBox.Show(disp, "ファイル削除（キーエンス手順）");
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }
        }

        /********************************************************************************
         * 機能 ：サーバからファイルを受信します（キーエンス手順）
         * API  ：btCommGetFile
        ********************************************************************************/
        private void Rcv_Master(string lf,string rf)
        {
            Int32 ret = 0;
            String disp = "";
            StringBuilder localFile = new StringBuilder("");
            StringBuilder remoteFile = new StringBuilder("");

            try
            {
                localFile = new StringBuilder(lf);
                remoteFile = new StringBuilder(rf);

                // タイムアウト10秒、キャンセル＝Cキー
                ret = KProtocol.btCommGetFile(remoteFile, localFile, 10, LibDef.BT_VK_CLR);
                if (ret != LibDef.BT_OK)
                {
                    disp = "btCommGetFile error ret[" + ret + "]";
                   MessageBox.Show(disp, "Error");
                    return;
                }
                disp = "ファイルを受信しました。\r\n";
                //MessageBox.Show(disp, "ファイル受信（キーエンス手順）");
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }
        }



        private void button3_Click(object sender, EventArgs e)
        {
            KP_Connect();
            //KP_SendLogFile("\\FlashDisk\\BT_FILES\\drv1\\log\\" + Form_Login._Form_LoginInstance.DevNO + "_Record_KB" + DateTime.Now.ToString("yyMMdd") + ".csv", Form_Login._Form_LoginInstance.DevNO + "_Record_KB" + DateTime.Now.ToString("yyMMdd") + ".csv");
            //KP_SendLogFile("\\FlashDisk\\BT_FILES\\drv1\\log\\" + Form_Login._Form_LoginInstance.DevNO + "_Record_PDS" + DateTime.Now.ToString("yyMMdd") + ".csv", Form_Login._Form_LoginInstance.DevNO + "_Record_PDS" + DateTime.Now.ToString("yyMMdd") + ".csv");

            Rcv_Master("\\FlashDisk\\BT_FILES\\drv1\\SKT_Stock\\UserInfo.csv", "UserInfo.csv");
            Rcv_Master("\\FlashDisk\\BT_FILES\\drv1\\SKT_Stock\\MngInfo.csv", "MngInfo.csv");
            
            
            KP_Disconnect();

            Form frmD = new Success();

            frmD.ShowDialog();
            frmD.Dispose();
            //FrmLogin._Form_LoginInstance.SetUserInfo();
            //FrmLogin._Form_LoginInstance.Show();
            //this.Hide();
            this.Close();

        }



    }
}