package kr.gmtc.gw.dev.asderecv.asde.asterix;

import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.LinkedHashMap;

import org.json.simple.JSONObject;
import org.yaml.snakeyaml.Yaml;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;


public class YamlFileLoader {

	private Object returnObj;

	/**
	 * yamlLoadToVo()
	 * yaml 파일을 JSON포멧으로 로드하여 vo객체로 변환후 리턴
	 * 
	 * @param sFile - yaml 파일 경로
	 * @param cVO - yaml파일 내용을 로드하여 담을 VO 클래스
	 * @return Object를 파라메터로 넘어온 VO클래수로 casting하여 반환
	 * @throws Json 포멧의 데이터를 Object로 변환시 오류발생하면 예외발생.
	 * @date 2023.02.07
	 * 
	 */
	public <T> T yamlLoadToVo(String sFile, Class<T> cVO) {
		
		if(sFile == null || sFile.equals("")) return cVO.cast(returnObj);
		
		try {
			
			 InputStream is = this.getClass().getResourceAsStream("/" + sFile);
			 Reader reader = (is != null ? new InputStreamReader(is) : new FileReader(sFile));
			    
			// yaml 파일 로드
			//LinkedHashMap<String, Object> propMap = new Yaml().load(new FileReader(ResourceUtils.getFile(sFile)));
			 LinkedHashMap<String, Object> propMap = new Yaml().load(reader);
			
			// 파일내용을 JSON 포멧으로 변환
			JSONObject jsonObject = new JSONObject(propMap);
        	
			// JSON 데이터를 Object로 변환
			ObjectMapper objectMapper = new ObjectMapper();
			
			// Array Null값, 중간중간 존재하지 않는 필드 무시
			objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
			objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, false);
			 
			returnObj = objectMapper.readValue(jsonObject.toJSONString(), cVO);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return cVO.cast(returnObj);
	}

}
