package kr.gmtc.gw.asderecv.asde.asterixSpec;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import kr.gmtc.gw.asderecv.asde.asterixSpec.vo.AsterixSpecVO;
import kr.gmtc.gw.asderecv.asde.utils.YamlFileLoader;

/****************************************************************************

    asterixList.xml에 정의 되어 있는 모든 spec 파일을 로드하여 specMap에 가지고있고
    instance를 생성한 클레스에서 getSpec()을 통해 로드된 spec을 가져갈 수 있음.
    
    사용예)
 	 String sCatNo = "10";
 	 AsterixSpec asterixSpec = new AsterixSpec();
 	 SpecDepth1Category currentSpec = asterixSpec.getSpec(sCatNo);

    
******************************************************************************/

public class AsterixSpecLoader
{
	private Logger logger;
	
    // category별 spec
 	private LinkedHashMap<String, AsterixSpecVO> specMap; 	
 	
    public AsterixSpecLoader() {
    	initCategory();
    }
    
    private void initCategory()
    {
    	
    	this.specMap = new LinkedHashMap<String, AsterixSpecVO>();
    	
    	AsterixList_Category target;
    	
    	this.logger = LoggerFactory.getLogger(this.getClass());
        
    	logger.info("Initializing.. ");
    	// 분석해야 할 Asterix Spec 파일 목록 로드 (resource/asterixList.xml)
        try
        {
            JAXBContext context = JAXBContext.newInstance(AsterixList_Category.class);
            Unmarshaller umarshaller = context.createUnmarshaller();
            InputStream is = this.getClass().getClassLoader().getResourceAsStream("asterixList.xml");
            target = (AsterixList_Category)umarshaller.unmarshal(is);
        }
        catch(Exception e)
        {
        	logger.error("initCategory- Spec List 로드 실패");
        	return;
       	}
        
        if(target == null) {
        	logger.error("initCategory- Spec List 로드 실패(target=null)");
        	return;
        }
        
        List<AsterixList_SpecFile> spacList = target.getAsterixs();
        
        // category별로 상이한 spec내용을 로드 (cat-10, cat-11, ...)
        for(int i=0;i<spacList.size(); i++)
        {
        	AsterixList_SpecFile as = spacList.get(i);
            String catNo = as.getCategory();
            String file = as.getFile();
            
            AsterixSpecVO category = null; 
            
            try {
				category = getAsterixCategoryBySpec(file);
			} catch (IOException e) {
				logger.error("객체생성 실패.");
			}
            
            this.specMap.put(catNo, category);

            logger.info("Category-" + catNo + " Spec 로드 성공 (파일:" + file + ")");
        }
        
        logger.info("initialized. .. ");
    }
    

    private AsterixSpecVO getAsterixCategoryBySpec(String sFile) throws IOException
    {
    	String sPath = "";
    	
    	if(sFile == null) return null;
        
    	sPath = sPath.concat(sFile);
    	
        try
        {

        	YamlFileLoader yamLoader = new YamlFileLoader();
        	
        	AsterixSpecVO category = yamLoader.yamlLoadToVo(sPath, AsterixSpecVO.class);
        	
            return category;
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
        return null;
    }
    
    
    public AsterixSpecVO getSpec(String catNo) { 
    	return this.specMap.get(catNo); 
    }
    
 
}


