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.cnife039.CNSV005201SCType;
import eo.service.client.cnife039.CNIFE039PortType;
import eo.service.client.cnife039.FuncCode;
import eo.service.client.cnife039.Sysid;
import eo.service.client.cnife039.PaywayCd;
import eo.service.client.cnife039.PaywayId;
import eo.service.client.cnife039.Record;
import eo.service.client.cnife039.PaywayCdO;
import eo.service.client.cnife039.PaySeq;
import eo.service.client.cnife039.PaywayIdO;
import eo.service.client.cnife039.TsyrnDspMngn;
import eo.service.client.cnife039.CrecardCompCd;
import eo.service.client.cnife039.CrecardCompNm;
import eo.service.client.cnife039.CrecardNo;
import eo.service.client.cnife039.CardUserName;
import eo.service.client.cnife039.CrecardYkKigen;
import eo.service.client.cnife039.PaywayYkFlg;
import java.util.List;
import java.util.ArrayList;
import eo.service.client.cnife039.Element;
import eo.service.client.cnife039.InitType;
import eo.service.client.cnife039.InitResponseType;
import eo.service.client.cnife039.ServiceIf;



@WebService(targetNamespace = "http://client.service.eo/CNIFE039 /",
		endpointInterface="eo.service.client.cnife039.CNIFE039PortType")
public class CNIFE039 implements CNIFE039PortType { 

		 @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>(); 

			CNSV005201SCType reqcnsv005201sc = initRequest.getCNSV005201SC(); 

		if(reqcnsv005201sc == null){

			return userData;
		}

			ServiceIf serviceIf = reqcnsv005201sc.getServiceIf();

			Map<Object, Object> serviceIfMap = new LinkedHashMap<Object, Object>();

			userData.put("CNSV005201SC", serviceIfMap);

		if(serviceIf == null){

			return userData;
		}
			serviceIfMap.put("func_code", RequestBuildHelper.getValue(serviceIf.getFuncCode()));
			serviceIfMap.put("sysid", RequestBuildHelper.getValue(serviceIf.getSysid()));
			serviceIfMap.put("payway_cd", RequestBuildHelper.getValue(serviceIf.getPaywayCd()));
			serviceIfMap.put("payway_id", RequestBuildHelper.getValue(serviceIf.getPaywayId()));

			return userData;
		}



@SuppressWarnings("unchecked") 
		private InitResponseType createResponseBean(LinkedHashMap<Object, Object> userData) 

			     throws BusinessException, IllegalReflectionException { 

			InitResponseType initResponse = new InitResponseType(); 
			Object obj = userData.get("CNSV005201SC"); 

		if(obj == null) {

			return initResponse;
		}

			HashMap<Object, Object> cnsv005201scMap = (HashMap<Object, Object>) obj;

			CNSV005201SCType resCNSV005201SC = new CNSV005201SCType();
			resCNSV005201SC.setType("service_if");

			ServiceIf serviceIf = new ServiceIf();
			serviceIf.setFuncCode(ResponseBuildHelper.createObject(cnsv005201scMap, FuncCode.class, "func_code"));
			serviceIf.setSysid(ResponseBuildHelper.createObject(cnsv005201scMap, Sysid.class, "sysid"));
			serviceIf.setPaywayCd(ResponseBuildHelper.createObject(cnsv005201scMap, PaywayCd.class, "payway_cd"));
			serviceIf.setPaywayId(ResponseBuildHelper.createObject(cnsv005201scMap, PaywayId.class, "payway_id"));


			Record record =new Record();
			List<Element> elemBeanList = record.getElement();
			ArrayList<HashMap<Object, Object>> record_list = (ArrayList<HashMap<Object, Object>>) cnsv005201scMap.get("record");
			if ( record_list != null){
			record.setType("list");

			for(HashMap<Object, Object> recordMap: record_list){
			Element element = new Element();
			element.setPaywayCdO(ResponseBuildHelper.createObject(recordMap,PaywayCdO.class,"payway_cd_o"));
			element.setPaySeq(ResponseBuildHelper.createObject(recordMap,PaySeq.class,"pay_seq"));
			element.setPaywayIdO(ResponseBuildHelper.createObject(recordMap,PaywayIdO.class,"payway_id_o"));
			element.setTsyrnDspMngn(ResponseBuildHelper.createObject(recordMap,TsyrnDspMngn.class,"tsyrn_dsp_mngn"));
			element.setCrecardCompCd(ResponseBuildHelper.createObject(recordMap,CrecardCompCd.class,"crecard_comp_cd"));
			element.setCrecardCompNm(ResponseBuildHelper.createObject(recordMap,CrecardCompNm.class,"crecard_comp_nm"));
			element.setCrecardNo(ResponseBuildHelper.createObject(recordMap,CrecardNo.class,"crecard_no"));
			element.setCardUserName(ResponseBuildHelper.createObject(recordMap,CardUserName.class,"card_user_name"));
			element.setCrecardYkKigen(ResponseBuildHelper.createObject(recordMap,CrecardYkKigen.class,"crecard_yk_kigen"));
			element.setPaywayYkFlg(ResponseBuildHelper.createObject(recordMap,PaywayYkFlg.class,"payway_yk_flg"));
			elemBeanList.add(element);
			}
			serviceIf.setRecord(record);
			}
			resCNSV005201SC.setServiceIf(serviceIf);
			initResponse.setCNSV005201SC(resCNSV005201SC);

			return initResponse;
		}
	}