package eo.service;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.Holder;
import javax.xml.ws.WebServiceContext;
import com.fujitsu.futurity.bp.controller.ws.BPMController;
import com.fujitsu.futurity.bp.controller.ws.data.RequestData;
import com.fujitsu.futurity.bp.controller.ws.data.ResponseData;
import com.fujitsu.futurity.bp.controller.ws.exception.BPMControllerException;
import com.fujitsu.futurity.bp.controller.ws.exception.BusinessException;
import com.fujitsu.futurity.bp.controller.ws.exception.IllegalReflectionException;
import com.fujitsu.futurity.bp.controller.ws.helper.RequestBuildHelper;
import com.fujitsu.futurity.bp.controller.ws.helper.ResponseBuildHelper;
import com.fujitsu.futurity.bp.controller.ws.util.TimeFormatter;
import eo.service.client.kkife350.KKSV085701SCType;
import eo.service.client.kkife350.KKIFE350PortType;
import eo.service.client.kkife350.FuncCode;
import eo.service.client.kkife350.MskmYmdFrom;
import eo.service.client.kkife350.MskmYmdTo;
import eo.service.client.kkife350.RsltMid;
import eo.service.client.kkife350.TratCd;
import eo.service.client.kkife350.UkNo;
import eo.service.client.kkife350.CustKana;
import eo.service.client.kkife350.Telno;
import eo.service.client.kkife350.Mid;
import eo.service.client.kkife350.StepPrgSbt;
import eo.service.client.kkife350.KojiSbt;
import eo.service.client.kkife350.StepPrgHizukeFrom;
import eo.service.client.kkife350.StepPrgHizukeTo;
import eo.service.client.kkife350.CnclDayFromNet;
import eo.service.client.kkife350.CnclDayToNet;
import eo.service.client.kkife350.CnclDayFromTel;
import eo.service.client.kkife350.CnclDayToTel;
import eo.service.client.kkife350.CnclDayFromTv;
import eo.service.client.kkife350.CnclDayToTv;
import eo.service.client.kkife350.CnclDayFromEoelec;
import eo.service.client.kkife350.CnclDayToEoelec;
import eo.service.client.kkife350.CnclDayFromMineo;
import eo.service.client.kkife350.CnclDayToMineo;
import eo.service.client.kkife350.EohntSvcCd;
import eo.service.client.kkife350.ThnxCallJssiUm;
import eo.service.client.kkife350.CnclJgiShinYmdFrom;
import eo.service.client.kkife350.CnclJgiShinYmdTo;
import eo.service.client.kkife350.CnclJgiSnnUm;
import eo.service.client.kkife350.CnclJgiHnnUm;
import eo.service.client.kkife350.Record;
import eo.service.client.kkife350.RsltUkNo;
import eo.service.client.kkife350.MskmYmd;
import eo.service.client.kkife350.TratCd1;
import eo.service.client.kkife350.TratCd2;
import eo.service.client.kkife350.CustNm;
import eo.service.client.kkife350.ThnxCallJssiYmd;
import eo.service.client.kkife350.UkSbt;
import eo.service.client.kkife350.UkYmdFrom;
import eo.service.client.kkife350.UkYmdTo;

import java.util.List;
import java.util.ArrayList;
import eo.service.client.kkife350.Element;
import eo.service.client.kkife350.InitType;
import eo.service.client.kkife350.InitResponseType;
import eo.service.client.kkife350.ServiceIf;



@WebService(targetNamespace = "http://client.service.eo/KKIFE350 /",
		endpointInterface="eo.service.client.kkife350.KKIFE350PortType")
public class KKIFE350 implements KKIFE350PortType { 

		 @Resource 
		private WebServiceContext context; 

		 @Override 
		
 public void init(Holder<String> requestIDPart, 
			 Holder<String> serviceIDPart, 
			 Holder<String> channelPart, 
			 Holder<String> viewIDPart, 
			 Holder<String> operatorIDPart, 
			 Holder<String> ipAddressPart,   
			 Holder<String> operateDatetimePart,
			 InitType initRequest,
			 Holder<String> errorLevelPart,
			 Holder<String> returnCodePart,
			 Holder<String> returnMessagePart,
			 Holder<InitResponseType> initResponse) {

		 try {
			 // サービスを呼び出した日時を設定
			 operateDatetimePart.value = TimeFormatter.format(System

				     .currentTimeMillis()); 

			 RequestData requestData = new RequestData();
			 requestData.setRequestID(requestIDPart.value); 
			 requestData.setServiceID(serviceIDPart.value);
			 requestData.setChannel(channelPart.value);
			 requestData.setViewID(viewIDPart.value);
			 requestData.setOperatorID(operatorIDPart.value);
			 requestData.setIpAddress(ipAddressPart.value);
			 requestData.setOperateDatetime(operateDatetimePart.value);

			 // ユーザデータ作成
			LinkedHashMap<Object, Object> userData = this.createUserData(initRequest);
			requestData.getUserData().putAll(userData);

			BPMController controller = new BPMController();;
			ResponseData responseData = controller.run(context, requestData);

			userData = responseData.getUserData();

			ipAddressPart.value = responseData.getIpAddress();
			 // errorLevelの先頭が9の場合、エラーを設定

		if (responseData.getErrorLevel().startsWith("9")) {

			errorLevelPart.value = "988";
			returnCodePart.value = "9000";
			returnMessagePart.value = "システムエラー";
			initResponse.value = null;

		 } else {

			errorLevelPart.value = responseData.getErrorLevel();
			returnCodePart.value = responseData.getReturnCode();
			returnMessagePart.value = responseData.getReturnMessage();
			initResponse.value = this.createResponseBean(userData);

			}

		 } catch (BPMControllerException e) {

			errorLevelPart.value = "988";
			returnCodePart.value = "9000";
			returnMessagePart.value = "システムエラー";
			e.printStackTrace();
			initResponse.value = null;

		 } catch (IllegalReflectionException e) {

			errorLevelPart.value = "988";
			returnCodePart.value = "9000";
			returnMessagePart.value = "システムエラー";
			e.printStackTrace();
			initResponse.value = null;

		 } catch (BusinessException e) {

			errorLevelPart.value = "888";
			returnCodePart.value = "9000";
			returnMessagePart.value = "業務エラー";
			e.printStackTrace();
			initResponse.value = null;

			}
		}



private LinkedHashMap<Object, Object> createUserData(InitType initRequest) 
			 throws BusinessException, IllegalReflectionException { 

			LinkedHashMap<Object, Object> userData = new LinkedHashMap<Object, Object>(); 

			KKSV085701SCType reqkksv085701sc = initRequest.getKKSV085701SC(); 

		if(reqkksv085701sc == null){

			return userData;
		}

			ServiceIf serviceIf = reqkksv085701sc.getServiceIf();

			Map<Object, Object> serviceIfMap = new LinkedHashMap<Object, Object>();

			userData.put("KKSV085701SC", serviceIfMap);

		if(serviceIf == null){

			return userData;
		}
			serviceIfMap.put("func_code", RequestBuildHelper.getValue(serviceIf.getFuncCode()));
			serviceIfMap.put("mskm_ymd_from", RequestBuildHelper.getValue(serviceIf.getMskmYmdFrom()));
			serviceIfMap.put("mskm_ymd_to", RequestBuildHelper.getValue(serviceIf.getMskmYmdTo()));
			serviceIfMap.put("trat_cd", RequestBuildHelper.getValue(serviceIf.getTratCd()));
			serviceIfMap.put("uk_no", RequestBuildHelper.getValue(serviceIf.getUkNo()));
			serviceIfMap.put("cust_kana", RequestBuildHelper.getValue(serviceIf.getCustKana()));
			serviceIfMap.put("telno", RequestBuildHelper.getValue(serviceIf.getTelno()));
			serviceIfMap.put("mid", RequestBuildHelper.getValue(serviceIf.getMid()));
			serviceIfMap.put("step_prg_sbt", RequestBuildHelper.getValue(serviceIf.getStepPrgSbt()));
			serviceIfMap.put("koji_sbt", RequestBuildHelper.getValue(serviceIf.getKojiSbt()));
			serviceIfMap.put("step_prg_hizuke_from", RequestBuildHelper.getValue(serviceIf.getStepPrgHizukeFrom()));
			serviceIfMap.put("step_prg_hizuke_to", RequestBuildHelper.getValue(serviceIf.getStepPrgHizukeTo()));
			serviceIfMap.put("cncl_day_from_net", RequestBuildHelper.getValue(serviceIf.getCnclDayFromNet()));
			serviceIfMap.put("cncl_day_to_net", RequestBuildHelper.getValue(serviceIf.getCnclDayToNet()));
			serviceIfMap.put("cncl_day_from_tel", RequestBuildHelper.getValue(serviceIf.getCnclDayFromTel()));
			serviceIfMap.put("cncl_day_to_tel", RequestBuildHelper.getValue(serviceIf.getCnclDayToTel()));
			serviceIfMap.put("cncl_day_from_tv", RequestBuildHelper.getValue(serviceIf.getCnclDayFromTv()));
			serviceIfMap.put("cncl_day_to_tv", RequestBuildHelper.getValue(serviceIf.getCnclDayToTv()));
			serviceIfMap.put("cncl_day_from_eoelec", RequestBuildHelper.getValue(serviceIf.getCnclDayFromEoelec()));
			serviceIfMap.put("cncl_day_to_eoelec", RequestBuildHelper.getValue(serviceIf.getCnclDayToEoelec()));
			serviceIfMap.put("cncl_day_from_mineo", RequestBuildHelper.getValue(serviceIf.getCnclDayFromMineo()));
			serviceIfMap.put("cncl_day_to_mineo", RequestBuildHelper.getValue(serviceIf.getCnclDayToMineo()));
			serviceIfMap.put("eohnt_svc_cd", RequestBuildHelper.getValue(serviceIf.getEohntSvcCd()));
			serviceIfMap.put("thnx_call_jssi_um", RequestBuildHelper.getValue(serviceIf.getThnxCallJssiUm()));
			serviceIfMap.put("cncl_jgi_shin_ymd_from", RequestBuildHelper.getValue(serviceIf.getCnclJgiShinYmdFrom()));
			serviceIfMap.put("cncl_jgi_shin_ymd_to", RequestBuildHelper.getValue(serviceIf.getCnclJgiShinYmdTo()));
			serviceIfMap.put("cncl_jgi_snn_um", RequestBuildHelper.getValue(serviceIf.getCnclJgiSnnUm()));
			serviceIfMap.put("cncl_jgi_hnn_um", RequestBuildHelper.getValue(serviceIf.getCnclJgiHnnUm()));
			serviceIfMap.put("uk_ymd_from", RequestBuildHelper.getValue(serviceIf.getUkYmdFrom()));
			serviceIfMap.put("uk_ymd_to", RequestBuildHelper.getValue(serviceIf.getUkYmdTo()));
			serviceIfMap.put("uk_sbt", RequestBuildHelper.getValue(serviceIf.getUkSbt()));

			return userData;
		}



@SuppressWarnings("unchecked") 
		private InitResponseType createResponseBean(LinkedHashMap<Object, Object> userData) 

			     throws BusinessException, IllegalReflectionException { 

			InitResponseType initResponse = new InitResponseType(); 
			Object obj = userData.get("KKSV085701SC"); 

		if(obj == null) {

			return initResponse;
		}

			HashMap<Object, Object> kksv085701scMap = (HashMap<Object, Object>) obj;

			KKSV085701SCType resKKSV085701SC = new KKSV085701SCType();
			resKKSV085701SC.setType("service_if");

			ServiceIf serviceIf = new ServiceIf();
			serviceIf.setFuncCode(ResponseBuildHelper.createObject(kksv085701scMap, FuncCode.class, "func_code"));
			serviceIf.setMskmYmdFrom(ResponseBuildHelper.createObject(kksv085701scMap, MskmYmdFrom.class, "mskm_ymd_from"));
			serviceIf.setMskmYmdTo(ResponseBuildHelper.createObject(kksv085701scMap, MskmYmdTo.class, "mskm_ymd_to"));
			serviceIf.setTratCd(ResponseBuildHelper.createObject(kksv085701scMap, TratCd.class, "trat_cd"));
			serviceIf.setUkNo(ResponseBuildHelper.createObject(kksv085701scMap, UkNo.class, "uk_no"));
			serviceIf.setCustKana(ResponseBuildHelper.createObject(kksv085701scMap, CustKana.class, "cust_kana"));
			serviceIf.setTelno(ResponseBuildHelper.createObject(kksv085701scMap, Telno.class, "telno"));
			serviceIf.setMid(ResponseBuildHelper.createObject(kksv085701scMap, Mid.class, "mid"));
			serviceIf.setStepPrgSbt(ResponseBuildHelper.createObject(kksv085701scMap, StepPrgSbt.class, "step_prg_sbt"));
			serviceIf.setKojiSbt(ResponseBuildHelper.createObject(kksv085701scMap, KojiSbt.class, "koji_sbt"));
			serviceIf.setStepPrgHizukeFrom(ResponseBuildHelper.createObject(kksv085701scMap, StepPrgHizukeFrom.class, "step_prg_hizuke_from"));
			serviceIf.setStepPrgHizukeTo(ResponseBuildHelper.createObject(kksv085701scMap, StepPrgHizukeTo.class, "step_prg_hizuke_to"));
			serviceIf.setCnclDayFromNet(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayFromNet.class, "cncl_day_from_net"));
			serviceIf.setCnclDayToNet(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayToNet.class, "cncl_day_to_net"));
			serviceIf.setCnclDayFromTel(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayFromTel.class, "cncl_day_from_tel"));
			serviceIf.setCnclDayToTel(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayToTel.class, "cncl_day_to_tel"));
			serviceIf.setCnclDayFromTv(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayFromTv.class, "cncl_day_from_tv"));
			serviceIf.setCnclDayToTv(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayToTv.class, "cncl_day_to_tv"));
			serviceIf.setCnclDayFromEoelec(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayFromEoelec.class, "cncl_day_from_eoelec"));
			serviceIf.setCnclDayToEoelec(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayToEoelec.class, "cncl_day_to_eoelec"));
			serviceIf.setCnclDayFromMineo(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayFromMineo.class, "cncl_day_from_mineo"));
			serviceIf.setCnclDayToMineo(ResponseBuildHelper.createObject(kksv085701scMap, CnclDayToMineo.class, "cncl_day_to_mineo"));
			serviceIf.setEohntSvcCd(ResponseBuildHelper.createObject(kksv085701scMap, EohntSvcCd.class, "eohnt_svc_cd"));
			serviceIf.setThnxCallJssiUm(ResponseBuildHelper.createObject(kksv085701scMap, ThnxCallJssiUm.class, "thnx_call_jssi_um"));
			serviceIf.setCnclJgiShinYmdFrom(ResponseBuildHelper.createObject(kksv085701scMap, CnclJgiShinYmdFrom.class, "cncl_jgi_shin_ymd_from"));
			serviceIf.setCnclJgiShinYmdTo(ResponseBuildHelper.createObject(kksv085701scMap, CnclJgiShinYmdTo.class, "cncl_jgi_shin_ymd_to"));
			serviceIf.setCnclJgiSnnUm(ResponseBuildHelper.createObject(kksv085701scMap, CnclJgiSnnUm.class, "cncl_jgi_snn_um"));
			serviceIf.setCnclJgiHnnUm(ResponseBuildHelper.createObject(kksv085701scMap, CnclJgiHnnUm.class, "cncl_jgi_hnn_um"));
			serviceIf.setUkYmdFrom(ResponseBuildHelper.createObject(kksv085701scMap, UkYmdFrom.class, "uk_ymd_from"));
			serviceIf.setUkYmdTo(ResponseBuildHelper.createObject(kksv085701scMap, UkYmdTo.class, "uk_ymd_to"));
			serviceIf.setUkSbt(ResponseBuildHelper.createObject(kksv085701scMap, UkSbt.class, "uk_sbt"));


			Record record =new Record();
			List<Element> elemBeanList = record.getElement();
			ArrayList<HashMap<Object, Object>> record_list = (ArrayList<HashMap<Object, Object>>) kksv085701scMap.get("record");
			if ( record_list != null){
			record.setType("list");

			for(HashMap<Object, Object> recordMap: record_list){
			Element element = new Element();
			element.setRsltUkNo(ResponseBuildHelper.createObject(recordMap,RsltUkNo.class,"rslt_uk_no"));
			element.setMskmYmd(ResponseBuildHelper.createObject(recordMap,MskmYmd.class,"mskm_ymd"));
			element.setTratCd1(ResponseBuildHelper.createObject(recordMap,TratCd1.class,"trat_cd_1"));
			element.setTratCd2(ResponseBuildHelper.createObject(recordMap,TratCd2.class,"trat_cd_2"));
			element.setCustNm(ResponseBuildHelper.createObject(recordMap,CustNm.class,"cust_nm"));
			element.setThnxCallJssiYmd(ResponseBuildHelper.createObject(recordMap,ThnxCallJssiYmd.class,"thnx_call_jssi_ymd"));
			element.setRsltMid(ResponseBuildHelper.createObject(recordMap,RsltMid.class,"rslt_mid"));
			elemBeanList.add(element);
			}
			serviceIf.setRecord(record);
			}
			resKKSV085701SC.setServiceIf(serviceIf);
			initResponse.setKKSV085701SC(resKKSV085701SC);

			return initResponse;
		}
	}