package com.openbanking.eai.agent.token;

import com.eactive.eai.agent.command.Command;
import com.eactive.eai.agent.command.CommandException;
import com.eactive.eai.common.util.Logger;
import com.openbanking.eai.common.token.AccessTokenManager;
import com.openbanking.eai.common.token.AccessTokenVO;

import java.util.HashMap;

public class ReloadAccessTokenCommand extends Command
{ 
     /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/** 
    * 1. 기능 : ReloadAccessTokenCommand 생성자 
    * 2. 처리 개요 : 
    * 3. 주의사항 
    *
    * @param 
    * @return 
    * @exception
    **/
    public ReloadAccessTokenCommand() {
        super("ReloadAccessTokenCommand");    
    }
    
    /** 
    * 1. 기능 :  AccessTokenManager의 데이터를 동기화
    * 2. 처리 개요 : AccessTokenManager의 데이터를 동기화
    * 3. 주의사항 
    *
    * @param 
    * @return 
    * @exception    CommandException
    **/
    public Object execute() throws CommandException
    {
        Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
        if (logger.isInfo()) logger.info(this.name + " is executed");
        
//        if ( !(args instanceof HashMap) ) {
//            String rspErrorCode = "EAIINIT001";
//            String msg = makeException(rspErrorCode, null);
//            if (logger.isError()) logger.error(msg);
//            throw new CommandException(msg);
//        }
        
        try {
//        	if (args == null) {
//        		if (logger.isError()) 
//        			logger.error("Refresh 토큰 정보가 없습니다.");
//        	}
        	
			AccessTokenManager manager = AccessTokenManager.getInstance();
			String adapterGroupNameList = manager.getTargetAdapterGroup();
	    	String[] adapterGroupNames = adapterGroupNameList.split("[,]");
			
	    	HashMap<String, AccessTokenVO> tokens = manager.getAllAccessTokenVO();
	    		
			// 토큰맵에서 어댑터그룹명이 없으면 삭제로 간주
	    	if (tokens != null) {
	    		for (String key : tokens.keySet()) {
					boolean isDelete = true;
					
					if (adapterGroupNames != null && adapterGroupNames.length > 0) {
						for (String adapterGroupName : adapterGroupNames) {
							if (key.equals(adapterGroupName)) {
								isDelete = false;
								break;
							}
						}
					}
					
					if (isDelete) {
						manager.stopToken(key);
					}
				}
	    	}

			if (adapterGroupNames != null && adapterGroupNames.length > 0) {
	    		for (String adapterGroupName : adapterGroupNames) {
	    			// 어댑터그룹명이 토큰맵에 없는 경우
	    			if (!tokens.containsKey(adapterGroupName)) {
	    				// 추가로 간주 토큰 발급 시작
	    				manager.startToken(adapterGroupName);
    				// 어댑터그룹명이 토큰맵에 있는 경우
	    			} else {
//	    				AdapterGroupVO gvo = AdapterManager.getInstance().getAdapterGroupVO(adapterGroupName);
//	    		    	
//	    		    	// 어댑터가 사용중이 아니면 중지
//	    		    	if (!gvo.isUsedFlag()) {
//	    		    		manager.stopToken(adapterGroupName);
//	    		    	}
	    			}
	    		}
	    	}
        	
			tokens = manager.getAllAccessTokenVO();
			
        	if (logger.isInfo()) 
        		logger.info(this.name + "] tokens : " + tokens);
        
            if(logger.isInfo()) 
            	logger.info(this.name + "] 토큰 정보가 Refresh 되었습니다.");
        } catch (Exception e) {
            String rspErrorCode = "EAIINIT003";
            String msg = makeException(rspErrorCode, e);
            if (logger.isError()) logger.error(msg, e);
            throw new CommandException(msg);
        }
        return "success";
    }

} 
