package com.eactive.eai.adapter.handler;

import java.util.Properties;

import com.eactive.eai.common.message.EAIMessage;

public interface AdapterErrorMessageHandler {
	/**
	 * 비표준 -> 표준 거래
	 * 아웃바운드 DefaultProcess에서 응답 표준헤더에 에러응답이 세팅되어 있는 경우, 비표준 응답 메시지 생성용
	 */
	public Object generateNonStandardErrorResponseMessage(String inboudnAdapterGroupName, String inboudnAdapterName,
			Properties callProp, Object outboundRequestData, EAIMessage resEaiMsg) throws Exception;

	/**
	 * 비표준 -> 표준 거래
	 * GW 내부 오류가 발생한 경우, RequestPrcessor에서 에러 응답을 생성하는 경우, ExceptionHandler에 의해 호출, 비표준 응답 메시지 생성용
	 */
	public Object generateNonStandardInternalErrorResponseMessage(String inboudnAdapterGroupName,
			String inboudnAdapterName, Properties callProp, Object inboundRequestData, EAIMessage resEaiMsg)
			throws Exception;

	/**
	 * 비표준 -> 표준 거래
	 * GW RequestProcess 호출 전에 Adapter(Filter)에서 오류가 발생한 경우, ApiAdapterController에 Exception에 맞추어, 비표준 응답 메시지 생성용
	 */
	public Object generateNonStandardInboundErrorResponseMessage(String inboudnAdapterGroupName,
			String inboudnAdapterName, Properties callProp, Object inboundRequestData, Object inboundResponseData,
			Throwable e) throws Exception;

	/**
	 * 표준 -> 비표준 거래
	 * 아웃바운드 어댑터에서 Exception이 발생했을 때, Outbound 어댑터에 의해서 호출하여 응답 메시지 생성
	 * 수신한 응답 메시지가 있을 수도 있고 없을 수도 있다.
	 */
	default public Object generateOutboundErrorResponseMessage(String outboundadapterGroupName,
			String outboundadapterName, Properties callProp, Object outboundRequestData, Object outboundResponseData,
			Throwable e) throws Exception {
		return null;
	}
	
	/**
	 * 표준 -> 비표준 거래
	 * 아웃바운드 어댑터에서 Exception이 발생했을 때, Outbound Process 응답 메시지 생성
	 */
	default public Object generateOutboundErrorResponseMessage(String outboundadapterGroupName,
			String outboundadapterName, Properties callProp, Object outboundRequestData, EAIMessage resEaiMsg)
			throws Exception {
		return null;
	}
}
