using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Collections;

using Cosmos.Common;
using Cosmos.CommonManager;
using Cosmos.BaseFrame;
using Cosmos.UserFrame;
using Cosmos.ServiceProvider;

namespace Cosmos.Service
{
    class SignPadUpdate : IDeviceUpdate
    {
        private FTP m_ClsFtp;
        private PosStatus m_cPosStatus = new PosStatus();                           // 기본정보 참조
        private StateServer StateObject = (StateServer)StateServer.GetInstance();   // StateObject : StateServer Object (객체)
        private DeviceStatus m_cDevStatus = new DeviceStatus();                     // 디바이스 관리
        private ISignPadUs m_cDeviceSignPad = null;                                 // 서명패드
        private IDataCommonUs m_cDataCommon = null;                                 // POS 공통함수 인터페이스
        private SManager sManager = new SManager();                                 // 이 객체를 통해 업무 Service 호출

        private Hashtable m_hFTPRecvData;                                           // 서명패드 업데이트 FTP 서버 정보

        public static string[] SignpadModel = { "OLTMS", "OLCSP", "100", "350", "150", "170" };
        public static string[] Ini_SignpadModel = { "OLTMS", "OLCSP", "SSP-100", "SN-350P", "SN-150P", "SR-170P" };

        public SignPadUpdate()
        {
            m_cPosStatus = (PosStatus)StateObject.POS;        // POS 기본정보
            m_cDevStatus = (DeviceStatus)StateObject.DEVICE;

            m_cDeviceSignPad = (ISignPadUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_SIGNPAD);
            m_cDataCommon = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
        }

        /// <summary>
        /// 서명패드 업데이트 파일 다운로드 FTP 정보 조회
        /// </summary>
        /// <returns></returns>
        public string FtpInfoIRT(string sTargetFileNm, string  sTargetLocalDate, ref Hashtable m_hFTPRecvData)
        {
            Hashtable htSendData = new Hashtable();
            Hashtable htRecvData = new Hashtable();

            string sRet = UserCom.RST_ERR;

            try
            {
                // 서버 조회
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.INQ_TYPE, ItemConst.IRT_INQ_TYPE.FTPINFO_REQ); // 서버 ftp 정보 요청 / 응답
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.FILE_NAME, sTargetFileNm); // 대상 파일 명
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.LOCAL_DATE, sTargetLocalDate); // 로컬 파일 일자
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.FTP_IP, "");         // FTP_IP
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.FTP_PORT, "");       // FTP_PORT
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.FTP_ID, "");         // FTP_ID
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.FTP_PWD, "");        // FTP_PWD
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.SIGN_PAD_PATH, "");  // SIGN_PAD_PATH
                htSendData.Add(Column.IQ_FTPINFO_REQ.DATA.RES_CD, "");         // 응답코드

                sRet = m_cDataCommon.ExecutePosIrt(ItemConst.COMM_MSG_TYPE.POSIRT,
                                                   m_cPosStatus.Base.CommSvrIp,
                                                   (int)m_cPosStatus.Base.BizInqPort,
                                                   10000,
                                                   htSendData,
                                                   ref htRecvData,
                                                   false);
                if (sRet != UserCom.RST_OK || htRecvData[Column.IQ_FTPINFO_REQ.DATA.RES_CD].ToString() != "00")
                {
                    sRet = UserCom.RST_ERR;
                    return sRet;
                }
                else
                {
                    sRet = UserCom.RST_OK;

                    m_hFTPRecvData = htRecvData;
                    // 업데이트 할 내역 정보 응답
                    //sFilesGrp = htRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_IP].ToString() + "|" + htRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_PORT].ToString() + "|"
                    //    + htRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_ID].ToString() + "|" + htRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_PWD].ToString();

                    return sRet;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);

            }
            return sRet;
        }

        /// <summary>
        /// 서명패드 업데이트 건수
        /// POS의 법인별_서명패드 모델에 대한 건수만 체크한다.
        /// </summary>
        /// <returns></returns>
        public int SignPadUpdateCnt(ref string sImgFileNm, ref string sAviFileNm, ref string sFirmFileNm)
        {
            int nRet = 0;

            sImgFileNm = "";

            //string sBrandDiv = "";   // 브랜드구분
            //string sICDiv = "";      // IC구분
            //string sModelDiv = "";   // 모델구분

            string SIGNPAD_FIRMWARE_Path = BaseCom.NxDonglePath + @"FIRMWARE\";
            string SIGNPAD_AVI_Path = BaseCom.NxDonglePath + @"AVI\";
            string SIGNPAD_IMG_Path = BaseCom.NxDonglePath + @"IMG\";

            try
            {
                if (System.IO.Directory.Exists(SIGNPAD_FIRMWARE_Path))
                {
                    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(SIGNPAD_FIRMWARE_Path);

                    if (di.GetFiles().Count() > 0)
                    {
                        nRet = nRet + 1;

                        FileInfo[] aFirm = di.GetFiles();

                        sFirmFileNm = aFirm[0].Name;
                    }
                }

                if (System.IO.Directory.Exists(SIGNPAD_AVI_Path))
                {
                    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(SIGNPAD_AVI_Path);

                    //nRet = nRet + di.GetFiles().Count();

                    if (di.GetFiles().Count() > 0)
                    {
                        nRet = nRet + 1;

                        FileInfo[] aAvi = di.GetFiles();

                        sAviFileNm = aAvi[0].Name;
                    }
                }

                if (System.IO.Directory.Exists(SIGNPAD_IMG_Path))
                {
                    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(SIGNPAD_IMG_Path);

                    if (di.GetFiles().Count() > 0)
                    {
                        nRet = nRet + 1;

                        foreach (var item in di.GetFiles())
                        {
                            if (sImgFileNm == "")
                            {
                                sImgFileNm = item.Name;
                            }
                            else
                            {
                                sImgFileNm = sImgFileNm + "|" + item.Name;
                            }
                        }
                    }

                }

                return nRet;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);

            }
            return nRet;
        }

        /// <summary>
        /// 서명패드 모델 체크 및 INI 파일 변경
        /// </summary>
        /// <returns></returns>
        public string SignPadModelCheck()
        {
            string retVal = string.Empty;
            string sModelDiv = "";   // 모델구분
 
            DataTable dtData = new DataTable();

            try
            {
                // 서명패드 스펙체크
                if (m_cDeviceSignPad.GetSignPadInfo(ref retVal) != true)
                {
                    return UserCom.RST_ERR;
                }
                else
                {
                    sModelDiv = CmUtil.MidH(retVal, 0, 9).Trim();
                }

                if (sModelDiv != "")
                {
                    dtData = m_cDataCommon.SeletCommonCode(PosConst.COMMON_CODE_GROUP.Z0027, "");
                    if (dtData != null && dtData.Rows.Count > 0)
                    {
                        foreach (DataRow dr in dtData.Rows)
                        {
                            if (sModelDiv == CmUtil.GetDataRowStr(dr, PosMst.MST_COMMON.DATA.CHAR_VAL_TITLE_VAL_01))
                            {
                                CmMessage m_PosDevice = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosDevice);

                                m_PosDevice.GetMessage("SIGNPAD").MakeMessageOverWrite("Model", Convert.ToString(CmUtil.GetDataRowStr(dr, PosMst.MST_COMMON.DATA.CMM_CD)));

                                m_PosDevice.MakeFileFromMessage(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosDevice);
                                break;
                            }
                        }
                    }

                    return sModelDiv;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }

            return "";
        }

        /// <summary>
        /// 서명패드 업데이트 상세 파일 명
        /// </summary>
        /// <returns></returns>
        public string SignPadUpdateFilesNm()
        {
            string sRet = "";
            string sBrandDiv = "";   // 브랜드구분
            string sICDiv = "";      // IC구분
            string sModelDiv = "";   // 모델구분

            string sSignPadUpdateFiles = "";

            try
            {





                //sBrandDiv = m_cPosStatus.Base.BrandDiv;
                //sICDiv = m_cDevStatus.ICReader.UseYn == true ? "IC" : "MSR";
                //sModelDiv = SignpadModel[Convert.ToInt16(m_cPosStatus.Base.OlePosSignPadModel) - 1];

                //string sFirmWare = "TGZ_" + sICDiv + "_" + sModelDiv + ".tgz";        // 펌웨어
                //string sMovie = "AVI_" + sModelDiv + ".avi";                          // 동영상
                //string sImage01 = "IMG01_" + sModelDiv + ".bmp";                      // 이미지01
                //string sImage02 = "IMG02_" + sModelDiv + ".bmp";                      // 이미지02
                //string sImage03 = "IMG03_" + sModelDiv + ".bmp";                      // 이미지03
                //string sImage04 = "IMG04_" + sModelDiv + ".bmp";                      // 이미지04

                //sSignPadUpdateFiles = sImage01 + "|" + sImage02 + "|" + sImage03 + "|" + sImage04 + "|" + sMovie + "|" + sFirmWare + "|";

                return sSignPadUpdateFiles;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);

                return sRet;
            }
        }

        /// <summary>
        /// 서명패드 업데이트 압축파일
        /// </summary>
        /// <param name="sZipFiles"></param>
        /// <returns></returns>
        public string SignPadModelFileGrp(ref string sZipFiles)
        {
            string sRet = UserCom.RST_ERR;
            string sBrandDiv = "";   // 브랜드구분
            string sModelDiv = "";   // 모델구분

            try
            {
                sBrandDiv = m_cPosStatus.Base.BrandDiv;
                sModelDiv = SignpadModel[Convert.ToInt16(m_cPosStatus.Base.OlePosSignPadModel) - 1].Replace("-","");

                if (sBrandDiv != "" && sModelDiv != "")
                {
                    string sFirmWare = sBrandDiv + "_TGZ_" + sModelDiv + ".zip";        // 펌웨어
                    string sMovie = sBrandDiv + "_AVI_" + sModelDiv + ".zip";           // 동영상
                    string sImage = sBrandDiv + "_IMG_" + sModelDiv + ".zip";           // 이미지

                    sZipFiles = sFirmWare + "|" + sMovie + "|" + sImage;

                    sRet = UserCom.RST_OK;
                }

                return sRet;

            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);

                return sRet;
            }
        }

        /// <summary>
        /// 서명패드 업데이트 서버 확인
        /// </summary>
        /// <param name="dtFtpDataTable"></param>
        /// <returns></returns>
        public string SignPadUpdateServerCheck(ref DataTable dtFtpDataTable)
        {
            string sRet = UserCom.RST_ERR;

            string sFirmDate = "";   // 펌웨어 INI 일자
            string sAviDate = "";    // 동영상 INI 일자
            string sImgDate = "";    // 이미지 INI 일자

            string sFirmNm = "";     // 펌웨어 압축파일 명
            string sAviNm = "";      // 동영상 압축파일 명
            string sImgNm = "";      // 이미지 압축파일 명

            string[] sIniDate = null; // INI 일자
            string[] sFileNm = null;  // 파일 명

            string sBrandDiv = "";   // 브랜드구분
            string sModelDiv = "";   // 모델구분

            DataTable dtData1 = new DataTable();     // 파일명 및 업데이트 일자
            DataTable dtData2 = new DataTable();     // FTP 정보

            try
            {
                sIniDate = new string[3];
                sFileNm = new string[3];

                // 업데이트 일자 가져오기
                CmMessage m_PosSaleInfo = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + PosConst.INI_FILE_NAME.PosSaleInfo);

                //sFirmDate = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "SignPadFirmwareDate"));
                //sAviDate = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "SignPadAviDate"));
                //sImgDate = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "SignPadImgDate"));

                sIniDate[0] = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "SignPadFirmwareDate"));
                sIniDate[1] = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "SignPadAviDate"));
                sIniDate[2] = CmUtil.StringNullEmpty(GetConfigInfo(m_PosSaleInfo, "POSOPEN", "SignPadImgDate"));

                // 파일명 가져오기
                sBrandDiv = m_cPosStatus.Base.BrandDiv;
                sModelDiv = SignpadModel[Convert.ToInt16(m_cPosStatus.Base.OlePosSignPadModel) - 1].Replace("-", "");

                if (sBrandDiv != "" && sModelDiv != "")
                {
                    //sFirmNm = sBrandDiv + "_TGZ_" + sModelDiv + ".zip";        // 펌웨어
                    //sAviNm = sBrandDiv + "_AVI_" + sModelDiv + ".zip";           // 동영상
                    //sImgNm = sBrandDiv + "_IMG_" + sModelDiv + ".zip";           // 이미지

                    sFileNm[0] = sBrandDiv + "_TGZ_" + sModelDiv + ".zip";           // 펌웨어
                    sFileNm[1] = sBrandDiv + "_AVI_" + sModelDiv + ".zip";           // 동영상
                    sFileNm[2] = sBrandDiv + "_IMG_" + sModelDiv + ".zip";           // 이미지
                }

                // 서명패드 업데이트 일자 데이터 테이블 정보 설정
                dtData1.Columns.Add(new DataColumn("UPDATE", typeof(string)));
                dtData1.Columns.Add(new DataColumn("ZIPNM", typeof(string)));

                // FTP 정보
                dtData2.Columns.Add(new DataColumn(Column.IQ_FTPINFO_REQ.DATA.FILE_NAME, typeof(string)));
                dtData2.Columns.Add(new DataColumn(Column.IQ_FTPINFO_REQ.DATA.FTP_IP, typeof(string)));
                dtData2.Columns.Add(new DataColumn(Column.IQ_FTPINFO_REQ.DATA.FTP_PORT, typeof(string)));
                dtData2.Columns.Add(new DataColumn(Column.IQ_FTPINFO_REQ.DATA.FTP_ID, typeof(string)));
                dtData2.Columns.Add(new DataColumn(Column.IQ_FTPINFO_REQ.DATA.FTP_PWD, typeof(string)));
                dtData2.Columns.Add(new DataColumn(Column.IQ_FTPINFO_REQ.DATA.SIGN_PAD_PATH, typeof(string)));

                for (int i = 0; i < sIniDate.Length; i++)
                {
                    DataRow dr = dtData1.NewRow();
                    dr["UPDATE"] = sIniDate[i];
                    dr["ZIPNM"] = sFileNm[i];

                    dtData1.Rows.Add(dr);
                }

                // 전문 통신 확인 후 해당 내용을 리턴한다.
                foreach (DataRow dataRow in dtData1.Rows)
                {
                    string sUpdate = CmUtil.GetDataRowStr(dataRow, "UPDATE");
                    string sZipNm = CmUtil.GetDataRowStr(dataRow, "ZIPNM");

                    // 전문 통신 체크
                    if (FtpInfoIRT(sZipNm, sUpdate, ref m_hFTPRecvData) != UserCom.RST_ERR)
                    {
                        if (m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.RES_CD].ToString() == "00")
                        {
                            DataRow dr2 = dtData2.NewRow();

                            dr2[Column.IQ_FTPINFO_REQ.DATA.FILE_NAME] = m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.FILE_NAME].ToString();
                            dr2[Column.IQ_FTPINFO_REQ.DATA.FTP_IP] = m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_IP].ToString();
                            dr2[Column.IQ_FTPINFO_REQ.DATA.FTP_PORT] = m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_PORT].ToString();
                            dr2[Column.IQ_FTPINFO_REQ.DATA.FTP_ID] = m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_ID].ToString();
                            dr2[Column.IQ_FTPINFO_REQ.DATA.FTP_PWD] = m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.FTP_PWD].ToString();
                            dr2[Column.IQ_FTPINFO_REQ.DATA.SIGN_PAD_PATH] = m_hFTPRecvData[Column.IQ_FTPINFO_REQ.DATA.SIGN_PAD_PATH].ToString();

                            dtData2.Rows.Add(dr2);
                        }
                    }
                }

                dtFtpDataTable = dtData2;

                return sRet;

            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);

                return sRet;
            }
        }

        /// <summary>
        /// 설정 파일 읽기
        /// </summary>
        /// <param name="cCfgInfo"></param>
        /// <param name="sGroup"></param>
        /// <param name="sValueName"></param>
        /// <returns></returns>
        private string GetConfigInfo(CmMessage cCfgInfo, string sGroup, string sValueName)
        {
            return GetConfigInfo(cCfgInfo, sGroup, sValueName, "");
        }
        private string GetConfigInfo(CmMessage cCfgInfo, string sGroup, string sValueName, string sDefault)
        {
            try
            {
                string sValue = cCfgInfo.GetMessage(sGroup).GetMessageValue(sValueName);
                if (sValue == null)
                    return sDefault;
                else
                    return sValue;
            }
            catch { }

            return sDefault;
        }
    }
}
