package com.dbs.mplus.service.mobile.consent;

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

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.dbs.mplus.exception.mobile.ApiCallException;
import com.dbs.mplus.framework.util.SessionUtil;
import com.dbs.mplus.service.api.MPlusApi;
import com.dbs.mplus.service.api.MPlusApiCallService;

@Service 
public class ConsentService {
	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private MPlusApiCallService apiCallService;

	/**
	 * 동의서 삭제 데이터 저장
	 * @param reqMap
	 * @return
	 */
	public Object saveDelete(Map<String, Object> reqMap) { 
		if(reqMap == null) {
			return null; 
		}
		
		Object result = null;
		
		// 화면으로부터 받을 데이터 
		// userId > 임시. 나중에 pid 값 받아와서 셋팅하는걸로 교체할것
		// consentMstRid
		// patientCode
		// clnDeptCode
		// ward
		// roomcd
		// formRid
		// consentState
		// reasonForUseN
		
		try { 

			reqMap.put("rewriteConsentMstRid", "0");
			reqMap.put("consentMstRidInt", reqMap.get("consentMstRid"));
			reqMap.put("reissueConsentMstRid", reqMap.get("consentMstRid"));
			
			result = this.apiCallService.execute(MPlusApi.CONSENT_SAVE_SAVEDELETE, reqMap); 
		
		}
		catch(ApiCallException ex) { 
			throw ex;
		}
		
		return result;
	}
	
	/**
	 * 동의서 임시 저장
	 * @param reqMap
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Object saveTempData(HttpServletRequest request, Map<String, Object> reqMap) { 
		if(reqMap == null) {
			return null; 
		}
		
		Object result = null;
		
		// 화면으로부터 받을 데이터 
		// 1. patientInfo : 환자 정보 (GetPatientInfo 로 조회했던) Object 전체
		// 2. consent : 앱에서 준 동의서 관련 정보 (formRid, formCd, consentMstRid, formXml, dataXml, deviceType, deviceIdentNo)
		//    - 앱에서 준거 가공해서 Object 로
		
		// 서버에서 추가하기 
		// 3. userId : 로그인 사용자 ID
		// 4. userName : 로그인 사용자 이름 (createUserName, modifyUserName)
		
		try { 
			// 임시 저장 프로세스
			// 1. 임시 데이터 저장 SaveTempData
			// 2. 기왕력 저장 SaveMedicalHistory
			//    - dataXml을 Parsing
			
			Map<String, Object> patientInfo = (Map<String, Object>) reqMap.get("patientInfo");
			
			Map<String, Object> consent = (Map<String, Object>) reqMap.get("consent");
			
			result = this.apiCallService.execute(MPlusApi.CONSENT_SAVE_SAVETEMPDATA, makeConsentMap(request, patientInfo, consent)); 
			
			Map<String, Object> consentMap = (Map<String, Object>) reqMap.get("consent");
			
			// ConsentParser consentParser = new ConsentParser((String) consentMap.get("dataXml"));
			StringBuffer sb = new StringBuffer();
			sb.append("<?xml version=\"1.0\" encoding=\"EUC-KR\"?>");
			sb.append("<response>");
			sb.append(" <response_header>");
			sb.append("<version>2.0</version>");
			sb.append("<primitive_type>SUBSCRIPTION_NOTIFICATION_RESPONSE</primitive_type>");
			sb.append("<transaction_id>537844880</transaction_id>");
			sb.append("<connection_id>CPTET_23000320</connection_id>");
			sb.append("</response_header>");
			sb.append("<subscription_notification_response>");
			sb.append("<result>0</result>");
			sb.append("<user_info_result>");
			sb.append("<user_info>");
			sb.append("<type>MDN</type>");
			sb.append("<id>0117991370</id>");
			sb.append(" </user_info>");
			sb.append("  <status>11</status>");
			sb.append("</user_info_result>");
			sb.append("</subscription_notification_response>");
			sb.append("</response>");
			
			ConsentParser consentParser = new ConsentParser((String) consentMap.get("dataXml"));
			
			result = this.apiCallService.execute(MPlusApi.CONSENT_SAVE_SAVEMEDICALHISTORY, consentParser.getResult());
			
			
		}
		catch(ApiCallException ex) { 
			throw ex;
		}
		
		return result;
	}
	
	public List<Map<String, Object>> saveComplete(HttpServletRequest request, Map<String, Object> reqMap) { 
		if(reqMap == null) {
			return null; 
		}
		
		Object result = null;
		List<Map<String, Object>> resultArray = new ArrayList<Map<String, Object>>();
		
		// 화면으로부터 받을 데이터 
		// 1. patientInfo : 환자 정보 (GetPatientInfo 로 조회했던) Object 전체
		// 2. consent : 앱에서 준 동의서 관련 정보 (formRid, formCd, consentMstRid, formXml, dataXml, deviceType, deviceIdentNo)
		//    - 앱에서 준거 가공해서 Object 로
		//    - imageInfo (imagePath, imageSize)
		
		// 서버에서 추가하기 
		// 3. userId : 로그인 사용자 ID
		// 4. userName : 로그인 사용자 이름 (createUserName, modifyUserName)
		
		try { 
			// 완료 저장 프로세스
			// 1. 임시 데이터 저장 SaveTempData
			// 2. 기왕력 저장 SaveMedicalHistory
			//    - dataXml을 Parsing
			// 3. 파일 갯수 만큼 파일 이름 요청하기 GetFileName
			// 4. 이미지 정보 INSERT
			// 5. 이미지 경로 내려줌
			Map<String, Object> patientInfo = (Map<String, Object>) reqMap.get("patientInfo");
			
			Map<String, Object> consent = (Map<String, Object>) reqMap.get("consent");
			
			result = this.apiCallService.execute(MPlusApi.CONSENT_SAVE_SAVECOMPLETE, makeConsentMap(request, patientInfo, consent)); 
			
			ConsentParser consentParser = new ConsentParser((String) consent.get("dataXml"));
			
			result = this.apiCallService.execute(MPlusApi.CONSENT_SAVE_SAVEMEDICALHISTORY, consentParser.getResult());
			
			ArrayList<Map<String, Object>> imageInfo = (ArrayList<Map<String, Object>>) consent.get("imageInfo");
			
			int imageCount = checkConsentImageInfo(imageInfo);
			if(imageCount == 0) {
				// 이미지 정보가 없음! 에러 날려주기
			}
			
			// GetFileName 파라메터 한번 만들기
			Map<String, Object> getFileNameParam = makeGetFileNameMap(request, patientInfo, consent);
			
			// 이미지 갯수만큼 이미지 정보만 덮어씌워서 GetFileName, SaveImageUploadInfo 수행
			for( int i = 0; i < imageCount; i++ ) {
				// 파일 사이즈, 
				getFileNameParam = addImageInfo(getFileNameParam, imageInfo, (i + 1));
				String fileName = (String) this.apiCallService.execute(MPlusApi.CONSENT_SAVE_GETFILENAME, getFileNameParam);
				fileName = fileName.concat(".jpg");
				
				Map<String, Object> saveImageInfoParam = makeSaveImageInfoParam(SessionUtil.getUserId(request), fileName, consent);
				result = this.apiCallService.execute(MPlusApi.CONSENT_SAVE_SAVEIMAGEUPLOADINFO, getFileNameParam);
				
				Map<String, Object> fileData = new HashMap<String, Object>();
				fileData.put("imageFileName", fileName);
				fileData.put("imageSize", getFileNameParam.get("filesize"));
				resultArray.add(fileData);
			}

		}
		catch(ApiCallException ex) { 
			throw ex;
		}
		
		return resultArray;
	}
	
	private Map<String, Object> makeConsentMap(HttpServletRequest request, Map<String, Object> patientInfo, Map<String, Object> consent) {
		
		Map<String, Object> data = new HashMap<String, Object>();
		
		// 로그인 사용자 ID
		data.put("userId", SessionUtil.getUserId(request));
		
		// 환자 관련
		data.put("patientCode", patientInfo.get("ioptID"));
		data.put("clnDeptCode", patientInfo.get("iodeptCd"));
		data.put("visitType", patientInfo.get("iovisitType"));
		data.put("hosType", patientInfo.get("iohosType"));
		data.put("clnDate", patientInfo.get("ioaddate"));
		data.put("ward", patientInfo.get("ioward"));
		data.put("roomcd", patientInfo.get("ioroomNo"));
		data.put("orderNo", patientInfo.get("ioorderNo"));
		data.put("orderName", patientInfo.get("iodxNm"));
		data.put("orderCd", patientInfo.get("iodxCd"));
		data.put("ocrCode", patientInfo.get("ioocrCd"));
		data.put("cretno", patientInfo.get("iocretNo"));
		
		// 동의서 관련
		data.put("formRid", consent.get("formRid"));
		data.put("formCd", consent.get("formCd"));
		
		// 신규 일경우 consentMstRid를 -1으로 넘겨야함
		String consentMsgRid = (String) consent.get("consentMstRid");
		if( StringUtils.isEmpty(consentMsgRid) ) {
			data.put("consentMstRid", "-1");
		} else {
			data.put("consentMstRid", consent.get("consentMstRid"));
		}
	
		data.put("rewriteConsentMstRid", "0");
		data.put("formXml", consent.get("formXml"));
		data.put("dataXml", consent.get("dataXml"));
		data.put("deviceType", consent.get("deviceType"));
		data.put("deviceIdentNo", consent.get("deviceIdentNo"));
						
		// 작성자/ 수정자 이름 - 기존 작성자랑 달라도 되는건지 ? 
		// 문서에는 둘다 현재 로그인한 사람 이름 넣으라고 되어있음
		data.put("createUserName", SessionUtil.getUserName(request));
		data.put("modifyUserName", SessionUtil.getUserName(request));
		
		return data;
	}

	private Map<String, Object> makeGetFileNameMap(HttpServletRequest request, Map<String, Object> patientInfo, Map<String, Object> consent) {

		Map<String, Object> data = new HashMap<String, Object>();
		
		// 로그인 사용자 ID
		data.put("userid", SessionUtil.getUserId(request));
		
		// 환자 관련
		data.put("pid", patientInfo.get("ioptID"));
		data.put("ordtype", patientInfo.get("iovisitType"));
		data.put("orddd", patientInfo.get("ioaddate"));
		data.put("cretno", patientInfo.get("iocretNo"));
		
		
		// 동의서 관련
		data.put("formcd", consent.get("formCd"));
	
		return data;
	}
	
	// 이미지 갯수 체크
	private int checkConsentImageInfo(ArrayList<Map<String, Object>> imageInfo) {
		if( imageInfo == null ) {
			return 0;
		}
		
		return imageInfo.size();
	}
	
	private Map<String, Object> addImageInfo(Map<String, Object> getFileNameParam, ArrayList<Map<String, Object>> imageInfo, int page) {
		getFileNameParam.put("filesize", imageInfo.get(page - 1).get("imageSize"));
		getFileNameParam.put("pageno", page);
		
		return getFileNameParam;
	}
	
	private Map<String, Object> makeSaveImageInfoParam(String userId, String fileName, Map<String, Object> consent) {
		Map<String, Object> data = new HashMap<String, Object>();
		
		// 동의서 이미지 정보
		data.put("consentState", "ELECTR_CMP");
		data.put("imageFileName", fileName);
		data.put("consentMstRid", consent.get("consentMstRid"));
		data.put("userId", userId);
		data.put("formRid", consent.get("formRid"));

		return data;
	}

}




