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.chife522.CHSV008101SCType;
import eo.service.client.chife522.CHIFE522PortType;
import eo.service.client.chife522.Version;
import eo.service.client.chife522.BillMethod;
import eo.service.client.chife522.BillMethodName;
import eo.service.client.chife522.KessaiId;
import eo.service.client.chife522.KessaiName;
import eo.service.client.chife522.ShopCd;
import eo.service.client.chife522.SyunoCoCd;
import eo.service.client.chife522.KyotenCd;
import eo.service.client.chife522.ShoporderNo;
import eo.service.client.chife522.SeikyuuKingaku;
import eo.service.client.chife522.KessaiDate;
import eo.service.client.chife522.KessaiTime;
import eo.service.client.chife522.KessaiNo;
import eo.service.client.chife522.ShiharaiDate;
import eo.service.client.chife522.ShiharaiTime;
import eo.service.client.chife522.NyukinDate;
import eo.service.client.chife522.NyukinTime;
import eo.service.client.chife522.NyukinKingaku;
import eo.service.client.chife522.FurikomiDate;
import eo.service.client.chife522.SeisanKijitu;
import eo.service.client.chife522.CvsCd;
import eo.service.client.chife522.TempoCd;
import eo.service.client.chife522.HaraidashiNo1;
import eo.service.client.chife522.HaraidashiNo2;
import eo.service.client.chife522.HaraidashiNo3;
import eo.service.client.chife522.BankCd;
import eo.service.client.chife522.BankName;
import eo.service.client.chife522.BranchCd;
import eo.service.client.chife522.BranchName;
import eo.service.client.chife522.CustNo;
import eo.service.client.chife522.KakuninNo;
import eo.service.client.chife522.ChanelKbn;
import eo.service.client.chife522.NoufukinKbn;
import eo.service.client.chife522.NyuuryokuKbn;
import eo.service.client.chife522.NoufuKbn;
import eo.service.client.chife522.InshiTax;
import eo.service.client.chife522.ShiharaiMethod;
import eo.service.client.chife522.Rescd;
import eo.service.client.chife522.Res;
import eo.service.client.chife522.StatusCd;
import eo.service.client.chife522.InitType;
import eo.service.client.chife522.InitResponseType;
import eo.service.client.chife522.ServiceIf;



@WebService(targetNamespace = "http://client.service.eo/CHIFE522 /",
		endpointInterface="eo.service.client.chife522.CHIFE522PortType")
public class CHIFE522 implements CHIFE522PortType { 

		 @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>(); 

			CHSV008101SCType reqchsv008101sc = initRequest.getCHSV008101SC(); 

		if(reqchsv008101sc == null){

			return userData;
		}

			ServiceIf serviceIf = reqchsv008101sc.getServiceIf();

			Map<Object, Object> serviceIfMap = new LinkedHashMap<Object, Object>();

			userData.put("CHSV008101SC", serviceIfMap);

		if(serviceIf == null){

			return userData;
		}
			serviceIfMap.put("version", RequestBuildHelper.getValue(serviceIf.getVersion()));
			serviceIfMap.put("bill_method", RequestBuildHelper.getValue(serviceIf.getBillMethod()));
			serviceIfMap.put("bill_method_name", RequestBuildHelper.getValue(serviceIf.getBillMethodName()));
			serviceIfMap.put("kessai_id", RequestBuildHelper.getValue(serviceIf.getKessaiId()));
			serviceIfMap.put("kessai_name", RequestBuildHelper.getValue(serviceIf.getKessaiName()));
			serviceIfMap.put("shop_cd", RequestBuildHelper.getValue(serviceIf.getShopCd()));
			serviceIfMap.put("syuno_co_cd", RequestBuildHelper.getValue(serviceIf.getSyunoCoCd()));
			serviceIfMap.put("kyoten_cd", RequestBuildHelper.getValue(serviceIf.getKyotenCd()));
			serviceIfMap.put("shoporder_no", RequestBuildHelper.getValue(serviceIf.getShoporderNo()));
			serviceIfMap.put("seikyuu_kingaku", RequestBuildHelper.getValue(serviceIf.getSeikyuuKingaku()));
			serviceIfMap.put("kessai_date", RequestBuildHelper.getValue(serviceIf.getKessaiDate()));
			serviceIfMap.put("kessai_time", RequestBuildHelper.getValue(serviceIf.getKessaiTime()));
			serviceIfMap.put("kessai_no", RequestBuildHelper.getValue(serviceIf.getKessaiNo()));
			serviceIfMap.put("shiharai_date", RequestBuildHelper.getValue(serviceIf.getShiharaiDate()));
			serviceIfMap.put("shiharai_time", RequestBuildHelper.getValue(serviceIf.getShiharaiTime()));
			serviceIfMap.put("nyukin_date", RequestBuildHelper.getValue(serviceIf.getNyukinDate()));
			serviceIfMap.put("nyukin_time", RequestBuildHelper.getValue(serviceIf.getNyukinTime()));
			serviceIfMap.put("nyukin_kingaku", RequestBuildHelper.getValue(serviceIf.getNyukinKingaku()));
			serviceIfMap.put("furikomi_date", RequestBuildHelper.getValue(serviceIf.getFurikomiDate()));
			serviceIfMap.put("seisan_kijitu", RequestBuildHelper.getValue(serviceIf.getSeisanKijitu()));
			serviceIfMap.put("cvs_cd", RequestBuildHelper.getValue(serviceIf.getCvsCd()));
			serviceIfMap.put("tempo_cd", RequestBuildHelper.getValue(serviceIf.getTempoCd()));
			serviceIfMap.put("haraidashi_no1", RequestBuildHelper.getValue(serviceIf.getHaraidashiNo1()));
			serviceIfMap.put("haraidashi_no2", RequestBuildHelper.getValue(serviceIf.getHaraidashiNo2()));
			serviceIfMap.put("haraidashi_no3", RequestBuildHelper.getValue(serviceIf.getHaraidashiNo3()));
			serviceIfMap.put("bank_cd", RequestBuildHelper.getValue(serviceIf.getBankCd()));
			serviceIfMap.put("bank_name", RequestBuildHelper.getValue(serviceIf.getBankName()));
			serviceIfMap.put("branch_cd", RequestBuildHelper.getValue(serviceIf.getBranchCd()));
			serviceIfMap.put("branch_name", RequestBuildHelper.getValue(serviceIf.getBranchName()));
			serviceIfMap.put("cust_no", RequestBuildHelper.getValue(serviceIf.getCustNo()));
			serviceIfMap.put("kakunin_no", RequestBuildHelper.getValue(serviceIf.getKakuninNo()));
			serviceIfMap.put("chanel_kbn", RequestBuildHelper.getValue(serviceIf.getChanelKbn()));
			serviceIfMap.put("noufukin_kbn", RequestBuildHelper.getValue(serviceIf.getNoufukinKbn()));
			serviceIfMap.put("nyuuryoku_kbn", RequestBuildHelper.getValue(serviceIf.getNyuuryokuKbn()));
			serviceIfMap.put("noufu_kbn", RequestBuildHelper.getValue(serviceIf.getNoufuKbn()));
			serviceIfMap.put("inshi_tax", RequestBuildHelper.getValue(serviceIf.getInshiTax()));
			serviceIfMap.put("shiharai_method", RequestBuildHelper.getValue(serviceIf.getShiharaiMethod()));
			serviceIfMap.put("rescd", RequestBuildHelper.getValue(serviceIf.getRescd()));
			serviceIfMap.put("res", RequestBuildHelper.getValue(serviceIf.getRes()));

			return userData;
		}



@SuppressWarnings("unchecked") 
		private InitResponseType createResponseBean(LinkedHashMap<Object, Object> userData) 

			     throws BusinessException, IllegalReflectionException { 

			InitResponseType initResponse = new InitResponseType(); 
			Object obj = userData.get("CHSV008101SC"); 

		if(obj == null) {

			return initResponse;
		}

			HashMap<Object, Object> chsv008101scMap = (HashMap<Object, Object>) obj;

			CHSV008101SCType resCHSV008101SC = new CHSV008101SCType();
			resCHSV008101SC.setType("service_if");

			ServiceIf serviceIf = new ServiceIf();
			serviceIf.setVersion(ResponseBuildHelper.createObject(chsv008101scMap, Version.class, "version"));
			serviceIf.setBillMethod(ResponseBuildHelper.createObject(chsv008101scMap, BillMethod.class, "bill_method"));
			serviceIf.setBillMethodName(ResponseBuildHelper.createObject(chsv008101scMap, BillMethodName.class, "bill_method_name"));
			serviceIf.setKessaiId(ResponseBuildHelper.createObject(chsv008101scMap, KessaiId.class, "kessai_id"));
			serviceIf.setKessaiName(ResponseBuildHelper.createObject(chsv008101scMap, KessaiName.class, "kessai_name"));
			serviceIf.setShopCd(ResponseBuildHelper.createObject(chsv008101scMap, ShopCd.class, "shop_cd"));
			serviceIf.setSyunoCoCd(ResponseBuildHelper.createObject(chsv008101scMap, SyunoCoCd.class, "syuno_co_cd"));
			serviceIf.setKyotenCd(ResponseBuildHelper.createObject(chsv008101scMap, KyotenCd.class, "kyoten_cd"));
			serviceIf.setShoporderNo(ResponseBuildHelper.createObject(chsv008101scMap, ShoporderNo.class, "shoporder_no"));
			serviceIf.setSeikyuuKingaku(ResponseBuildHelper.createObject(chsv008101scMap, SeikyuuKingaku.class, "seikyuu_kingaku"));
			serviceIf.setKessaiDate(ResponseBuildHelper.createObject(chsv008101scMap, KessaiDate.class, "kessai_date"));
			serviceIf.setKessaiTime(ResponseBuildHelper.createObject(chsv008101scMap, KessaiTime.class, "kessai_time"));
			serviceIf.setKessaiNo(ResponseBuildHelper.createObject(chsv008101scMap, KessaiNo.class, "kessai_no"));
			serviceIf.setShiharaiDate(ResponseBuildHelper.createObject(chsv008101scMap, ShiharaiDate.class, "shiharai_date"));
			serviceIf.setShiharaiTime(ResponseBuildHelper.createObject(chsv008101scMap, ShiharaiTime.class, "shiharai_time"));
			serviceIf.setNyukinDate(ResponseBuildHelper.createObject(chsv008101scMap, NyukinDate.class, "nyukin_date"));
			serviceIf.setNyukinTime(ResponseBuildHelper.createObject(chsv008101scMap, NyukinTime.class, "nyukin_time"));
			serviceIf.setNyukinKingaku(ResponseBuildHelper.createObject(chsv008101scMap, NyukinKingaku.class, "nyukin_kingaku"));
			serviceIf.setFurikomiDate(ResponseBuildHelper.createObject(chsv008101scMap, FurikomiDate.class, "furikomi_date"));
			serviceIf.setSeisanKijitu(ResponseBuildHelper.createObject(chsv008101scMap, SeisanKijitu.class, "seisan_kijitu"));
			serviceIf.setCvsCd(ResponseBuildHelper.createObject(chsv008101scMap, CvsCd.class, "cvs_cd"));
			serviceIf.setTempoCd(ResponseBuildHelper.createObject(chsv008101scMap, TempoCd.class, "tempo_cd"));
			serviceIf.setHaraidashiNo1(ResponseBuildHelper.createObject(chsv008101scMap, HaraidashiNo1.class, "haraidashi_no1"));
			serviceIf.setHaraidashiNo2(ResponseBuildHelper.createObject(chsv008101scMap, HaraidashiNo2.class, "haraidashi_no2"));
			serviceIf.setHaraidashiNo3(ResponseBuildHelper.createObject(chsv008101scMap, HaraidashiNo3.class, "haraidashi_no3"));
			serviceIf.setBankCd(ResponseBuildHelper.createObject(chsv008101scMap, BankCd.class, "bank_cd"));
			serviceIf.setBankName(ResponseBuildHelper.createObject(chsv008101scMap, BankName.class, "bank_name"));
			serviceIf.setBranchCd(ResponseBuildHelper.createObject(chsv008101scMap, BranchCd.class, "branch_cd"));
			serviceIf.setBranchName(ResponseBuildHelper.createObject(chsv008101scMap, BranchName.class, "branch_name"));
			serviceIf.setCustNo(ResponseBuildHelper.createObject(chsv008101scMap, CustNo.class, "cust_no"));
			serviceIf.setKakuninNo(ResponseBuildHelper.createObject(chsv008101scMap, KakuninNo.class, "kakunin_no"));
			serviceIf.setChanelKbn(ResponseBuildHelper.createObject(chsv008101scMap, ChanelKbn.class, "chanel_kbn"));
			serviceIf.setNoufukinKbn(ResponseBuildHelper.createObject(chsv008101scMap, NoufukinKbn.class, "noufukin_kbn"));
			serviceIf.setNyuuryokuKbn(ResponseBuildHelper.createObject(chsv008101scMap, NyuuryokuKbn.class, "nyuuryoku_kbn"));
			serviceIf.setNoufuKbn(ResponseBuildHelper.createObject(chsv008101scMap, NoufuKbn.class, "noufu_kbn"));
			serviceIf.setInshiTax(ResponseBuildHelper.createObject(chsv008101scMap, InshiTax.class, "inshi_tax"));
			serviceIf.setShiharaiMethod(ResponseBuildHelper.createObject(chsv008101scMap, ShiharaiMethod.class, "shiharai_method"));
			serviceIf.setRescd(ResponseBuildHelper.createObject(chsv008101scMap, Rescd.class, "rescd"));
			serviceIf.setRes(ResponseBuildHelper.createObject(chsv008101scMap, Res.class, "res"));
			serviceIf.setStatusCd(ResponseBuildHelper.createObject(chsv008101scMap, StatusCd.class, "status_cd"));
			resCHSV008101SC.setServiceIf(serviceIf);
			initResponse.setCHSV008101SC(resCHSV008101SC);

			return initResponse;
		}
	}