using System.IO;
using System.Net;
using System.Data;
using System.Net.NetworkInformation;

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

/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 프로그래 시작 처리
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Service
{
    class ProgramStart : IServiceUs
    {
        private SManager sManager = new SManager();                                 // 이 객체를 통해 업무 Service 호출
        private StateServer StateObject = (StateServer)StateServer.GetInstance();   // StateObject : StateServer Object (객체)
        private PosStatus m_cPosStatus;                                             // 기본정보 참조
        private TranStatus m_cTrnStatus;                                            // 거래정보 참조
        private DeviceStatus m_cDevStatus ;                                         // 장치정보 참조

        private IDataProcessUs m_cDataSrv = null;                                   // 거래데이터 합계금액 계산 및 관리
        private IDataCommonUs m_cDataCommSrv = null;                                // 거래 공통 함수 관리
        private IServiceUs m_cSaveCfgSrv = null;                                    // 설정파일 저장
        private IServiceUs m_cReadCfgSrv = null;                                    // 설정파일 읽기
        private IMasterUs m_cMstService = null;                                     // 마스터 인터페이스
        private IServiceUs m_cLoadMstSrv = null;                                    // 기초마스터 로딩 처리
        private IVanCommonUs m_cVanCommon = null;

        public ProgramStart()
        {
            m_cPosStatus = (PosStatus)StateObject.POS;              // POS 기본정보
            m_cTrnStatus = (TranStatus)StateObject.TRAN;            // POS 거래정보
            m_cDevStatus = (DeviceStatus)StateObject.DEVICE;        // POS 장치정보

            m_cDataSrv = (IDataProcessUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_SERVICE);
            m_cDataCommSrv = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
            m_cSaveCfgSrv = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.SAVE_CONFIGINFO);
            m_cReadCfgSrv = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.READ_CONFIGINFO);
            m_cMstService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.POS_MASTER);
            m_cLoadMstSrv = (IServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_OPEN_CLOSE.DLL, ServiceLists.BSV_OPEN_CLOSE.LOAD_MASTER_INFO);
            m_cVanCommon = (IVanCommonUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.VANSPCNCOMMON);
        }

        /// <summary>
        /// 프로그램 시작(환경파일로딩)
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string Execute(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                m_cPosStatus.ClearAll();
                m_cTrnStatus.ClearAll();

                m_cReadCfgSrv.Execute(new string[] {});     // POS 환경설정 파일 읽기

                // 로그레벨 Set
                UserLog.LogLevel = (int)m_cPosStatus.Base.LogLevel;

                // 프로그램 기동 시 다운 받을 마스터 항목 설정
                SetNormalMasterList();
                // 복합매장일 경우 다운 받을 마스터 항목 설정
                SetComplexStorMasterList();
                // Background로 다운 받을 마스터 항목 설정
                SetBackgroundMasterList();
                // Sub POS가 다운 받을 마스터 항목 설정
                SetSubPosMasterList();
                // 캠페인 관련 마스터 항목 설정
                SetCampaignMasterList();

                sRet = UserCom.RST_OK;
            }
            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>
        private void SetNormalMasterList()
        {
            try
            {
                MasterListManager.SetNormalMaster(new string[]
                {
                      MasterLists.MST_MOT_MSG.ID                            // 01 - MOT 메시지 마스터
                    , MasterLists.MST_MOT_MSG_DTL.ID                        // 02 - MOT 메시지 마스터 상세
                    , MasterLists.MST_POS.ID                                // 03 - POS 마스터
                    //, MasterLists.MST_POS_SETTNG.ID                         // 04 - POS 설정 마스터
                    , MasterLists.MST_POS_OPTN.ID                           // 05 - POS 옵션 마스터
                    , MasterLists.MST_VAN.ID                                // 06 - VAN 마스터
                    , MasterLists.MST_WEB_LNKAGE.ID                         // 07 - WEB연동 버튼 마스터
                    , MasterLists.MST_CMM.ID                                // 08 - 공통 마스터
                    //, MasterLists.MST_FUNC_KEY_TRADE_TYPEPER.ID             // 09 - 기능키 거래유형별 마스터
                    , MasterLists.MST_FUNC_KEY_GRP.ID                       // 10 - 기능키 그룹 마스터                  
                    , MasterLists.MST_FUNC_KEY.ID                           // 11 - 기능키 마스터                       
                    , MasterLists.MST_PIC_AUTH.ID                           // 12 - 담당자 권한 마스터                  
                    , MasterLists.MST_ITEM_CLSS.ID                          // 13 - 상품 분류 마스터                    
                    , MasterLists.MST_MSG.ID                                // 14 - 메시지 마스터                       
                    , MasterLists.MST_CULTURE.ID                            // 15 - 문화 마스터                         
                    , MasterLists.MST_SUBPRC_MENU.ID                        // 16 - 부가메뉴 마스터                     
                    , MasterLists.MST_SUBPRC_MENU_GRP.ID                    // 17 - 부가메뉴그룹 마스터                 
                    , MasterLists.MST_USER.ID                               // 18 - 사용자 마스터                       
                    , MasterLists.MST_ITEM.ID                               // 19 - 상품 마스터                         
                    , MasterLists.MST_ITEM_BAR_CD.ID                        // 20 - 상품 바코드 마스터                  
                    , MasterLists.MST_GIF.ID                                // 21 - 상품권 마스터                       
                    , MasterLists.MST_ITEM_SET.ID                           // 22 - 세트 마스터                         
                    , MasterLists.MST_ITEM_SET_GRP.ID                       // 23 - 세트그룹 마스터                     
                    , MasterLists.MST_MEAL_TCKT.ID                          // 24 - 식권 마스터                         
                    , MasterLists.MST_BILL_MSG.ID                           // 25 - 영수증 마스터                       
                    , MasterLists.MST_BILL_TYPE.ID                          // 26 - 영수증유형 마스터                   
                    , MasterLists.MST_BILL_TYPE_GRP.ID                      // 27 - 영수증유형그룹 마스터               
                    , MasterLists.MST_STOR.ID                               // 28 - 점포 마스터                         
                    //, MasterLists.MST_ADMT_TYPE_GRP.ID                      // 29 - 정산지 타입 그룹 마스터             
                    //, MasterLists.MST_ADMT_TYPE.ID                          // 30 - 정산지 타입 마스터                  
                    , MasterLists.MST_KTCH_DEVICE.ID                        // 31 - 주방DEVICE 마스터                   
                    , MasterLists.MST_KTCH_DEVICE_ITEM.ID                   // 32 - 주방DEVICE상품 마스터       
                    //, MasterLists.MST_FLOOR.ID                              // 35 - 층 마스터                           
                    , MasterLists.MST_CPI_COMPNT.ID                         // 36 - 캠페인 상품 그룹 관리 마스터        
                    , MasterLists.MST_CPI.ID                                // 37 - 캠페인 마스터                       
                    , MasterLists.MST_CPI_HOUR.ID                           // 38 - 캠페인 시간 마스터                  
                    , MasterLists.MST_CPI_ITEM.ID                           // 39 - 캠페인 상품 마스터                  
                    , MasterLists.MST_CPI_PRT_MSG.ID                        // 40 - 캠페인 출력메시지 마스터            
                    , MasterLists.MST_CPI_CARD.ID                           // 41 - 캠페인 카드 마스터                  
                    , MasterLists.MST_CPI_LTTR_PRT.ID                       // 42 - 캠페인 복권 출력 메시지 관리 마스터 
                    //, MasterLists.MST_TBL.ID                                // 43 - 테이블 마스터                       
                    , MasterLists.MST_FLAVOUR.ID                            // 44 - 플레이버 마스터                     
                    , MasterLists.MST_EXCHG_RATE.ID                         // 45 - 환율 마스터                         
                    , MasterLists.MST_ITEM_KEY_COMPNT.ID                    // 46 - 상품 키 구성 마스터                 
                    , MasterLists.MST_ITEM_KEY_L_CLSS.ID                    // 47 - 상품 키 대분류 마스터
                    //, MasterLists.MST_ITEM_KEY_CLSS_BATCH.ID                // 48 - 상품 키 분류 배치 마스터
                    , MasterLists.MST_ITEM_KEY_CLSS.ID                      // 49 - 상품 키 분류 마스터                 
                    , MasterLists.MST_ITEM_KEY.ID                           // 50 - 상품 키 마스터                      
                    , MasterLists.MST_BOOKMK.ID                             // 51 - 즐겨찾기 마스터                     
                    //, MasterLists.MST_DOWN_INFO.ID                          // 52 - 마스터 다운로드 정보                
                    //, MasterLists.MST_IMAGE_INFO.ID                         // 53 - 이미지 정보 마스터                  
                    , MasterLists.MST_CUST_DSP.ID                           // 54 - 고객화면 마스터                     
                    , MasterLists.MST_TEST_MODE.ID                          // 55 - 시험모드 마스터
                    , MasterLists.MST_TEST_MODE_DTL_INFO.ID                 // 57 - 시험모드 상세정보 마스터            
                    , MasterLists.MST_TEST_MODE_DTL_LOC.ID                  // 58 - 시험모드 상세위치 마스터            
                    , MasterLists.MST_PAY_DC.ID                             // 59 - 결제할인 마스터                     
                    , MasterLists.MST_PAY_DC_CPN.ID                         // 60 - 결제할인 쿠폰 마스터                
                    , MasterLists.MST_PAY_DC_CPN_ITEM.ID                    // 61 - 결제할인 쿠폰 상품 마스터           
                    , MasterLists.MST_TERM_COOP_CMP_DC_ITEM.ID              // 62 - 기간 제휴사 할인 상품 마스터        
                    , MasterLists.MST_TERM_COOP_CMP_PAY_DC.ID               // 63 - 기간 제휴사 결제 상품 마스터        
                    , MasterLists.MST_CARD_PREFIX.ID                        // 64 - 카드 PREFIX 마스터                  
                    , MasterLists.MST_PAY_DC_PRFX.ID                        // 65 - 결제 할인 PREFIX 마스터             
                    , MasterLists.MST_COMPLEX_SHOP_STOR.ID                  // 66 - 복합매장점포 마스터                 
                    , MasterLists.MST_DPST_WTHDR_ACC.ID                     // 67 - 입출금 계정 코드 마스터             
                    , MasterLists.MST_POSMST_TABLE_LST.ID                   // 68 - POS 다운 테이블 LIST                
                    , MasterLists.MST_PLU_AMT.ID                            // 69 - 상품 조회 조건_금액 마스터          
                    , MasterLists.MST_PLU_NM.ID                             // 70 - 상품 조회 조건_상품 마스터          
                    , MasterLists.MST_OUT_SD_VEND_ITEM.ID                   // 71 - 외부 업체 상품 마스터                   
                    , MasterLists.MST_STOR_INSPCT.ID                        // 72 - 점포점검 스케쥴 마스터              
                    , MasterLists.MST_SALESORG_INSPCT_GRP.ID                // 73 - 점폼점검내역 그룹 마스터            
                    , MasterLists.MST_SALESORG_INSPCT_DTL.ID                // 74 - 점폼점검내역 상세 마스터            
                    , MasterLists.MST_SALESORG_SURVY_MSG.ID                 // 75 - 영수증 설문조사 메시지 마스터       
                    , MasterLists.MST_DC_DTL.ID                             // 76 - 할인 상세 마스터
                    , MasterLists.MST_PRECARD.ID                            // 77 - 중국 선불카드 마스터
                    , MasterLists.MST_STR_DAILY_INSPCT_LIST.ID              // 78 - 점포 일일 장비 점검 마스터
                    , MasterLists.MST_CARD_CMP.ID                           // 79 - 카드사 마스터
                    , MasterLists.MST_ONLINE_CPN.ID                         // 80 - 온라인 쿠폰 마스터
                    , MasterLists.MST_OUT_SD_VEND_STOR.ID                   // 81 - 외부I/F 점포 코드 관리 마스터
                    , MasterLists.MST_KTCH_ITEM_INFO.ID                     // 82 - 레시피 정보 2017.09.07 추가

                    //#20171116 온라인 쿠폰 제품군코드,상품코드 존재 시 할인 대상이 변경되도록 추가 start, phj
                    // 20180112, 온라인쿠폰관련 마스터수신 주석처리, SRLEE
                    //#20180502 온라인쿠폰 제품군, 상품코드 할인 적용 기능 적용 start
                    //적용시 주석 해제
                    , MasterLists.MST_CPN_ITEM_GRP_MNG.ID                   // 83 온라인 쿠폰 제품군 마스터 MST_CPN_ITEM_GRP_MNG
                    , MasterLists.MST_CPN_ITEM_GRP_MNG_DTL.ID               // 84 온라인 쿠폰 제품군 상세 마스터 MST_CPN_ITEM_GRP_MNG_DTL
                    //#20180502 온라인쿠폰 제품군, 상품코드 할인 적용 기능 적용 end
                    //#20171116 온라인 쿠폰 제품군코드,상품코드 존재 시 할인 대상이 변경되도록 추가 end, phj

                    //#20180418 고객 구매이력 정보 표시 및 해피쿠폰 발송 start, 20180510
                    //적용시 주석 해제
                    , MasterLists.STR_SEND_CPN_MST.ID                       // 85 고객 구매이력 조회 마스터 STR_SEND_CPN_MST
                    , MasterLists.STR_SEND_CPN_DTL.ID                       // 86 고객 구매이력 조회 상세(발송 쿠폰) STR_SEND_CPN_DTL
                    //#20180418 고객 구매이력 정보 표시 및 해피쿠폰 발송 end, 20180510

                    //#2018-02-25 - 1997fx11 : Kiosk 관련 추가
                    //#2019-03-11 - 1997fx11 : Class명을 'NHS_STORE_PRD_CATE'에서 'NHS_STOR_PRD_CATE' 로 변경
                    //#2019-03-11 - 1997fx11 : Class명을 'NHS_STORE_PRD_KEY'에서 'NHS_STORE_PRD_KEY' 로 변경
                    //
                    ,KioskLists.NHS_SCREEN.ID                       //  01 : 점포별 대기화면
                    ,KioskLists.NHS_SCREEN_CONTENTS.ID      //  02 : 대기화면 레이어별 리소스
                    ,KioskLists.NHS_SCREEN_LAYER.ID             //  03 : 대기화면 레이어
                    //,KioskLists.NHS_STOR_PRD_CATE.ID       //  04 : 점포별 제품카테고리 - 2019-03-11 -1997fx11 : NHS_STOR_PRD_CATE 항목 삭제
                    ,KioskLists.NHS_STOR_PRD_KEY.ID        //  05 : 점포별 제품 터치키
                    ,KioskLists.NHS_UI_TEMPLATE.ID              //  06 : 점포별 UI템플릿
                    ,KioskLists.NHS_CPI_CONTENTS.ID             //  07 : 캠페인 리소스
                    //,KioskLists.NHS_CUST_BUY_HIST.ID             //  08 : 고객구매이력 - 2019-03-07 -1997fx11 : NHS_CUST_BUY_HIST 항목 삭제
                    ,KioskLists.NHS_LANG_MSG.ID                     //  09 : 제품 다국어
                    ,KioskLists.NHS_LAYOUT.ID                       //  10 : 화면구성
                    //,KioskLists.NHS_PRD_CATE_L.ID                     //  11 : 제품카테고리(대분류) - 2019-03-11 -1997fx11 : NHS_PRD_CATE_L 항목 삭제
                    //,KioskLists.NHS_PRD_CATE_M.ID                     //  12 : 제품카테고리(중분류) - 2019-03-11 -1997fx11 : NHS_PRD_CATE_M 항목 삭제
                    ,KioskLists.NHS_PRD_MST.ID                      //  13 : 제품마스터
                    ,KioskLists.NHS_OPTN_MST.ID                //  14 : 부가옵션마스터
                    ,KioskLists.NHS_PRD_OPTN_GRP.ID             //  15 : 부가옵션그룹
                    ,KioskLists.NHS_PRD_OPTN.ID                     //  16 : 부가옵션
                    ,KioskLists.NHS_PRD_CATE.ID                     //  17 : 제품카테고리
                    ,KioskLists.NHS_STOR_PRD_TAG.ID                     //  18 : 점포 제품별 태그정보
                    ,KioskLists.NHS_LINK_ITEM.ID //19 : 링크상품
                    ,KioskLists.NHS_STOR_FLAVOR.ID //20 : BR 플레이버  21은 mst 05번으로
                    ,KioskLists.NHS_FUNC_INFO.ID //22: 결제수단 사용여부
                });
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }


        /// <summary>
        /// 복합매장일 경우 다운 받을 마스터 항목 설정
        /// </summary>
        private void SetComplexStorMasterList()
        {
            try
            {
                MasterListManager.SetComplexStorMaster(new string[] {
                      MasterLists.MST_SUBPRC_MENU.ID                        // 16 - 부가메뉴 마스터
                    , MasterLists.MST_SUBPRC_MENU_GRP.ID                    // 17 - 부가메뉴 그룹 마스터
                    , MasterLists.MST_ITEM.ID                               // 19 - 상품 마스터
                    , MasterLists.MST_ITEM_BAR_CD.ID                        // 20 - 상품 바코드 마스터
                    , MasterLists.MST_ITEM_SET.ID                           // 22 - 세트 마스터
                    , MasterLists.MST_ITEM_SET_GRP.ID                       // 23 - 세트 그룹 마스터
                    , MasterLists.MST_KTCH_DEVICE.ID                        // 31 - 주방Device 마스터
                    , MasterLists.MST_KTCH_DEVICE_ITEM.ID                   // 32 - 주방Device 상품 마스터
                    , MasterLists.MST_CPI_ITEM.ID                           // 39 - 캠페인 상품 마스터
                    , MasterLists.MST_FLAVOUR.ID                            // 44 - 플레이버 마스터
                    , MasterLists.MST_ITEM_KEY_COMPNT.ID                    // 46 - 상품키 구성 마스터
                    , MasterLists.MST_ITEM_KEY_L_CLSS.ID                    // 47 - 상품키 대분류 마스터
                    , MasterLists.MST_ITEM_KEY_CLSS.ID                      // 49 - 상품키 분류 마스터
                    , MasterLists.MST_ITEM_KEY.ID                           // 50 - 상품키 마스터
                    , MasterLists.MST_BOOKMK.ID                             // 51 - 즐겨찾기 마스터
                    , MasterLists.MST_KTCH_ITEM_INFO.ID                     // 82 - 레시피 정보 2017.09.07 추가
                });
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// Background로 다운 받을 마스터 항목 설정
        /// </summary>
        private void SetBackgroundMasterList()
        {
            try
            {
                MasterListManager.SetBackgroundMaster(new string[] {
                      MasterLists.MST_ITEM.ID                               // 19 - 상품 마스터
                    , MasterLists.MST_CPI_COMPNT.ID                         // 36 - 캠페인 상품 그룹 관리 마스터
                    , MasterLists.MST_CPI_HOUR.ID                           // 38 - 캠페인 시간 마스터
                    , MasterLists.MST_CPI_ITEM.ID                           // 39 - 캠페인 상품 마스터
                    , MasterLists.MST_CPI_PRT_MSG.ID                        // 40 - 캠페인 출력 메시지 마스터
                    , MasterLists.MST_CPI_CARD.ID                           // 41 - 캠페인 카드 마스터
                    , MasterLists.MST_CPI_LTTR_PRT.ID                       // 42 - 캠페인 복권 출력 메시지 관리
                    , MasterLists.MST_CPI.ID                                // 37 - 캠페인 마스터
                });
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// SUB POS 가 다운 받을 마스터 항목 설정
        /// </summary>
        private void SetSubPosMasterList()
        {
            try
            {
                MasterListManager.SetSubPosMaster(new string[] {
                      MasterLists.MST_POS.ID                                // 03 - POS 마스터
                    , MasterLists.MST_MSG.ID                                // 14 - 메시지 마스터
                    , MasterLists.MST_STOR.ID                               // 28 - 점포 마스터
                    , MasterLists.MST_COMPLEX_SHOP_STOR.ID                  // 66 - 복합매장점포 마스터       
                    , MasterLists.MST_ITEM_KEY_COMPNT.ID                    // 46 - 상품 키 구성 마스터   
                });
            }
            catch(Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        private void SetCampaignMasterList()
        {
            try
            {
                MasterListManager.SetCampaignMaster(new string[] {
                      MasterLists.MST_CPI_COMPNT.ID                         // 36 - 캠페인 상품 그룹 관리 마스터
                    , MasterLists.MST_CPI_HOUR.ID                           // 38 - 캠페인 시간 마스터
                    , MasterLists.MST_CPI_ITEM.ID                           // 39 - 캠페인 상품 마스터
                    , MasterLists.MST_CPI_PRT_MSG.ID                        // 40 - 캠페인 출력 메시지 마스터
                    , MasterLists.MST_CPI_CARD.ID                           // 41 - 캠페인 카드 마스터
                    , MasterLists.MST_CPI_LTTR_PRT.ID                       // 42 - 캠페인 복권 출력 메시지 관리
                    , MasterLists.MST_CPI.ID                                // 37 - 캠페인 마스터
                });
            }
            catch(Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
    }
}
