package com.eactive.eai.rms.onl.transaction.extnl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import com.eactive.eai.rms.common.base.SqlMapClientTemplateDao;


@Repository("interfaceDao")
public class InterfaceDao extends SqlMapClientTemplateDao {
	
    public int selectListCount(HashMap paramMap) throws Exception {
    	return (Integer)template.queryForObject("Interface.selectListCount", paramMap);
    }	
    public List selectList(HashMap paramMap) throws Exception {
    	return template.queryForList("Interface.selectList", paramMap);
    }	
	
    public HashMap selectDetail(HashMap paramMap) throws Exception {
    	return (HashMap)template.queryForObject("Interface.selectDetail", paramMap);
    }	

    public void insert(HashMap paramMap) throws Exception{
        this.template.insert("Interface.insert", paramMap);
    }      
     
    public void delete(HashMap paramMap) throws Exception{
        this.template.delete("Interface.delete", paramMap);
    }	
    
    /**		Detail 추가 정보  **/
    public HashMap selectDetailHE10(HashMap paramMap) throws Exception {
    	return (HashMap)template.queryForObject("Interface.selectDetailHE10", paramMap);
    }	

    public void mergeHE10(HashMap paramMap) throws Exception{
        this.template.insert("Interface.mergeHE10", paramMap);
    }      
     
    public void deleteHE10(HashMap paramMap) throws Exception{
        this.template.delete("Interface.deleteHE10", paramMap);
    }    
    

	/** 내부 표준 전문 */
	public void mergeToHS04(HashMap<String,Object> vo) {
		
		HashMap<String,Object> std = new HashMap<String,Object>();
    	std.put("bzwkSvcKeyName"      ,vo.get("bzwkSvcKeyName"));// 시스템인터페이스코드
    	std.put("COMMON_IFID"         ,vo.get("eaiTranName"));
    	std.put("HEADER_MESGDMANDVCD" ,vo.get("splizDmndDstcd"));// 전문요청 구분
    	std.put("COMMON_HMABDVCD"     ,vo.get("stndTelgmWtinExtnlDstcd"));
    	template.insert("Interface.mergeToHS04", std);
	}
    public void mergeToHS05(HashMap<String,Object> vo) {
    	HashMap<String,HashMap<String,Object>> map = new HashMap<String,HashMap<String,Object>>();
    	String bzwkSvcKeyName = (String)vo.get("bzwkSvcKeyName");
    	
    	List<HashMap<String,String>> list = template.queryForList("Interface.selectListHS03", vo);//의미 없는 vo
    	
    	//default 값 셋팅
    	for(HashMap<String,String> h : list ){
    		String columnName    = h.get("COLUMNNAME"); 
    		String columnDefault = h.get("COLUMNDEFAULT");
    		if (columnDefault == null || "".equals(columnDefault.trim())){
    			map.put(columnName,setHashMap(bzwkSvcKeyName,columnName,""));// DEFAULT값
    		}else{
    			map.put(columnName,setHashMap(bzwkSvcKeyName,columnName,columnDefault));// DEFAULT값
    		}
    	}
    	List<HashMap<String,String>> list2 = template.queryForList("Interface.detailToHS05", vo);
    	for(HashMap<String,String> h : list2 ){
    		String columnName  = h.get("COLUMNNAME"); 
    		String columnValue = h.get("COLUMNVALUE");
    		if (columnValue != null && !"".equals(columnValue.trim())){
    			map.put(columnName,setHashMap(bzwkSvcKeyName,columnName,columnValue));// DEFAULT값
    		}
    	}    	
		
    	map.put("COMMON_IFID"         , setHashMap(bzwkSvcKeyName,"COMMON_IFID"           ,(String)vo.get("eaiTranName")));// 전문요청 구분
    	map.put("HEADER_MESGDMANDVCD" , setHashMap(bzwkSvcKeyName,"HEADER_MESGDMANDVCD"   ,(String)vo.get("splizDmndDstcd")));// 전문요청 구분
    	map.put("COMMON_HMABDVCD"     , setHashMap(bzwkSvcKeyName,"COMMON_HMABDVCD"       ,(String)vo.get("stndTelgmWtinExtnlDstcd")));// 전문요청 구분
    	map.put("COMMON_SRVCID"       , setHashMap(bzwkSvcKeyName,"COMMON_SRVCID"         ,(String)vo.get("serviceId")));// 서비스ID
    	map.put("COMMON_ORTRRESTRYN"  , setHashMap(bzwkSvcKeyName,"COMMON_ORTRRESTRYN"    ,"O".equals(vo.get("io")) && "R".equals(vo.get("splizDmndDstcd")) ? "Y" : "N"));// 당발에 응답인 경우 Y
    	
    	
    	for(String key : map.keySet()){
    		HashMap<String,Object> std = map.get(key);
    		template.insert("Interface.mergeToHS05", std);
    	}
	}
    private HashMap<String,Object> setHashMap(String bzwkSvcKeyName , String columnName ,String columnValue){
    	HashMap<String,Object> std = new HashMap<String,Object>();
    	std.put("bzwkSvcKeyName", bzwkSvcKeyName);
    	std.put("columnName", columnName);
    	std.put("columnValue",columnValue);
    	return std; 
    }
	
	
	public void mergeToHE01(HashMap<String,Object> vo) {
	// 기동 어뎁터
	// Async 인 경우 As, Sync인 경우 Sy
	// SOCKET 인 경우 처리 후 개별 수정 하는 것으로 !
	String type ="";
	if ("ASYN".equals(vo.get("svcMotivUseDstcd")) || "SYNC".equals(vo.get("svcMotivUseDstcd"))){
		type = (String) vo.get("svcMotivUseDstcd");
	}else if ("ASYN_SYNC".equals(vo.get("svcMotivUseDstcd"))){
		type = "ASYN";
	}else if ("SYNC_ASYN".equals(vo.get("svcMotivUseDstcd"))){
		type = "SYNC";
	}

	HashMap<String,Object> eai = new HashMap<String,Object>(); 
	
	eai.put("eaiSvcName"         , vo.get("eaiSvcName")      ); // EAI서비스명            
	eai.put("eaiBzwkDstcd"       , vo.get("eaiBzwkDstcd")    ); // EAI업무구분코드        
	eai.put("svcHMSEonot"        , "0"                       ); // 서비스시각유무         
	eai.put("svcMotivUseDstcd"   , type                      ); // 서비스동기사용구분코드                      
	eai.put("svcPrcesDsticName"  , "SINGLE"                ); // 서비스프로세스구분명
	eai.put("flowCtrlRoutName"   , vo.get("flowCtrlRoutName")); // 흐름통제라우팅명
	eai.put("intgraDsticName"    , "ONLINE"                ); // 통합구분명                                 
	eai.put("svcBfClmnLogYn"     , "0"                     ); // 서비스전컬럼로그여부
	eai.put("gstatSysAdptrBzwkGroupName", vo.get("fromAdapter")); // 기동시스템어댑터업무그룹명
	eai.put("sevrLogLvelNo"      , 0                       ); // 서버로그레벨번호  
	eai.put("svcLogLvelNo"       , 3                       ); // 서비스로그레벨번호
	eai.put("errEaiSvcName"			 , vo.get("errEaiSvcName")		); //오류EAI서비스명
	eai.put("dmndErrChngIdName"		, (null==vo.get("dmndErrChngIdName"))?"":vo.get("dmndErrChngIdName"));	// 요청오류변환ID명
	eai.put("dmndErrFldName"		, (null==vo.get("dmndErrFldName"))?"":vo.get("dmndErrFldName"));  // 요청에러필드명
	eai.put("RspnsErrChngIdName"	, (null==vo.get("RspnsErrChngIdName"))?"":vo.get("RspnsErrChngIdName")); //응답오류변환ID명
	eai.put("RspnsErrFldName"		, (null==vo.get("RspnsErrFldName"))?"":vo.get("RspnsErrFldName")); // 응답에러필드명
	eai.put("eaiSvcDesc"         , vo.get("eaiSvcDesc")      ); //  EAI서비스 설명
	eai.put("eaiSevrDstcd", vo.get("eaiSevrDstcd")        ); //EAI 서버구분코드내용
	eai.put("modfiMgtStusDstcd",  (null==vo.get("modfiMgtStusDstcd"))?"":vo.get("modfiMgtStusDstcd"));    //변경관리상태구분코드내용
	eai.put("eaiLastAmndYMS"         , vo.get("eaiLastAmndYMS")      ); //  EAI최종수정일시
	eai.put("eaiGroupCoCd", 	"KB0"        ); //EAI그룹회사코드내용
	eai.put("tranType", vo.get("tranType")        ); //거래처리구분코드내용
	eai.put("useYn", vo.get("useYn") );
	template.insert("Interface.mergeToHE01", eai);
}

public void mergeToHE02(HashMap<String,Object> vo) {
	// 수동 어뎁터
	// Async 인 경우 As, Sync인 경우 Sy
	// SOCKET 인 경우 처리 후 개별 수정 하는 것으로 !
	// 내부 응답인 경우 CBS 에 인스턴스 별로 다름
	String type ="";
	if ("ASYN".equals(vo.get("svcMotivUseDstcd")) || "SYNC".equals(vo.get("svcMotivUseDstcd"))){
		type =(String)vo.get("svcMotivUseDstcd");
	}else if ("ASYN_SYNC".equals(vo.get("svcMotivUseDstcd"))){
		type = "SYNC";
	}else if ("SYNC_ASYN".equals(vo.get("svcMotivUseDstcd"))){
		type = "ASYN";
	}
	HashMap<String,Object> eai = new HashMap<String,Object>();
	eai.put("eaiSvcName"             , vo.get("eaiSvcName")         ); // EAI서비스명                
	eai.put("svcPrcssNo"             , 1                          ); // 서비스처리번호
	eai.put("psvIntfacDsticName"     , type                       ); // 수동인터페이스구분명        
	eai.put("psvSysBzwkDstcd"        , vo.get("eaiBzwkDstcd")       ); // 수동시스템업무구분코드          
	eai.put("psvSysIDName"           , "EAIDOM"                   ); // 수동시스템ID명         
	eai.put("psvSysSvcDsticName"     , " "                        ); // 수동시스템서비스구분명      
	eai.put("flovrYn"                , (Boolean)vo.get("failOver")? "1" : "0"); // 장애극복여부            
	eai.put("chngEonot"              , "0"                        ); // 변환유무             
	eai.put("chngMsgIDName"          , " "                        ); // 변환메시지ID명         
	eai.put("bascRspnsMsgCmprCtnt"   , " "                        ); // 기본응답메시지비교내용      
	eai.put("bascRspnsChngEonot"     , "0"                        ); // 기본응답변환유무             
	eai.put("bascRspnsChngMsgIDName" , " "                        ); // 기본응답변환메시지ID명     
	eai.put("errRspnsMsgCmprCtnt"    , " "                        ); // 오류응답메시지비교내용      
	eai.put("errRspnsChngEonot"      , "0"                        ); // 오류응답변환유무         
	eai.put("errRspnsChngMsgIDName"  , " "                        ); // 오류응답변환메시지ID명     
	eai.put("nextSvcPrcssNo"         , 1                          ); // 다음서비스처리번호      
	eai.put("toutVal"                , 60                         ); // 타임아웃값          
	eai.put("cmpenSvcPrcssDsticName" , " "                        ); // 보상서비스처리구분명                 
	eai.put("supplDelYn"             , "0"                        ); // 추가삭제여부         
	eai.put("hdrCtrlDstcd"           , "01"                       ); // 헤더제어구분코드  
	eai.put("hdrRefClsName"          , " "                        ); // 헤더참조클래스명
	eai.put("restOption"      	     , " "                        ); // REST추가내용  

	eai.put("psvSysAdptrBzwkGroupName", vo.get("toAdapter")); // 수동시스템어댑터업무그룹명  
	if( "SYNC_ASYN".equals(vo.get("svcMotivUseDstcd")) && ((String)vo.get("eaiSvcName")).endsWith("R1")){ 	//EAI에 한함	
		eai.put("psvSysAdptrBzwkGroupName", " ");
		eai.put("outbndRoutName","HTTPOUT");// 아웃바운드라우팅명 
	}else{
		if ("NET".equals(((String)vo.get("toAdapter")).substring(8, 11))){
			eai.put("outbndRoutName","SOCKETOUT");// 아웃바운드라우팅명 
		}else if ("HTT".equals(((String)vo.get("toAdapter")).substring(8, 11))){
			eai.put("outbndRoutName","HTTPOUT");// 아웃바운드라우팅명 
		}
	}
	template.insert("Interface.mergeToHE02", eai);
	
	
    //String intfacPtrnCd = vo.getGstatSysAdptr().substring(12, 13) + vo.getPsvSysAdptr().substring(12, 13);
    if( "ASYN_SYNC".equals(vo.get("svcMotivUseDstcd")) ) {
		HashMap<String,Object> eai2 = new HashMap<String,Object>();
		eai2.put("eaiSvcName"               , vo.get("eaiSvcName")   ); // EAI서비스명                
		eai2.put("svcPrcssNo"               , 2                      ); // 서비스처리번호
		eai2.put("psvIntfacDsticName"       , "S".equals(((String)vo.get("extAdapter")).substring(12, 13)) ? "SYNC" : "ASYN" ); // 수동인터페이스구분명        
		eai2.put("psvSysBzwkDstcd"          , vo.get("eaiBzwkDstcd") ); // 수동시스템업무구분코드          
		eai2.put("psvSysIDName"             , "EAIDOM"); // 수동시스템ID명         
		eai2.put("psvSysSvcDsticName"       , " "); // 수동시스템서비스구분명      
		eai2.put("flovrYn"                  , (Boolean)vo.get("failOver") ? "1" : "0"); // 장애극복여부            
		eai2.put("chngEonot"                , "0"); // 변환유무             
		eai2.put("chngMsgIDName"            , " "); // 변환메시지ID명         
		eai2.put("bascRspnsMsgCmprCtnt"     , " "); // 기본응답메시지비교내용      
		eai2.put("bascRspnsChngEonot"       , "0"); // 기본응답변환유무             
		eai2.put("bascRspnsChngMsgIDName"   , " "); // 기본응답변환메시지ID명     
		eai2.put("errRspnsMsgCmprCtnt"      , " "); // 오류응답메시지비교내용      
		eai2.put("errRspnsChngEonot"        , "0"); // 오류응답변환유무         
		eai2.put("errRspnsChngMsgIDName"    , " "); // 오류응답변환메시지ID명     
		eai2.put("nextSvcPrcssNo"           , 1); // 다음서비스처리번호      
		eai2.put("toutVal"                  , 60); // 타임아웃값          
		eai2.put("cmpenSvcPrcssDsticName"   , " "); // 보상서비스처리구분명                 
		eai2.put("supplDelYn"               , "0"); // 추가삭제여부         
		eai2.put("hdrCtrlDstcd"             , "01"); // 헤더제어구분코드  
		eai2.put("hdrRefClsName"            , " "); // 헤더참조클래스명  

		eai2.put("psvSysAdptrBzwkGroupName", vo.get("extAdapter") ); // 수동시스템어댑터업무그룹명  
		eai2.put("outbndRoutName"          , ((String)vo.get("extAdapter")).indexOf("NET") > -1 ? "SOCKETOUT" : "HTTPOUT" ); // 아웃바운드라우팅명       

		template.insert("Interface.mergeToHE02", eai2);
    } else {
		template.delete("Interface.deleteNo2ToHE02", eai);
    }	
	
}
	
	public void deleteToHS04(HashMap<String,Object> std) {
		template.delete("Interface.deleteToHS04", std);
	}
	public void deleteToHS05(HashMap<String,Object> std) {
		template.delete("Interface.deleteToHS05", std);
	}
}
