package love.wangqi.exception.handler;

import io.netty.channel.Channel;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import love.wangqi.config.GatewayConfig;
import love.wangqi.exception.GatewayException;

import java.net.ConnectException;
import java.util.concurrent.RejectedExecutionException;

/**
 * @author: wangqi
 * @description:
 * @date: Created in 2018/6/5 下午6:16
 */
public class DefaultExceptionHandler extends AbstractExceptionHandler {
    private GatewayConfig config = GatewayConfig.getInstance();

    @Override
    public ExceptionResponse getExceptionResponse(Exception exception) {
        ExceptionResponse exceptionResponse = new ExceptionResponse();
        if (exception instanceof GatewayException) {
            GatewayException gatewayException = (GatewayException) exception;
            exceptionResponse.setStatus(gatewayException.getStatus());
            exceptionResponse.setContentType("text/plain");
            exceptionResponse.setContent(gatewayException.getMessage());
        } else if (exception instanceof ConnectException) {
            exceptionResponse.setStatus(HttpResponseStatus.NOT_FOUND);
            exceptionResponse.setContentType("text/plain");
            exceptionResponse.setContent("connect server refused");
        } else if (exception instanceof RejectedExecutionException) {
            exceptionResponse.setStatus(HttpResponseStatus.TOO_MANY_REQUESTS);
            exceptionResponse.setContentType("text/plain");
            exceptionResponse.setContent("too many requests");
        } else {
            exceptionResponse.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
            exceptionResponse.setContentType("text/plain");
            exceptionResponse.setContent(exception.getMessage());
        }
        return exceptionResponse;
    }

    @Override
    public void send(Channel channel, ExceptionResponse exceptionResponse) {
        String content = exceptionResponse.getContent();
        FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, exceptionResponse.getStatus());
        if (content != null) {
            response.headers().set("X-Ca-Error-Message", content);
        }
        config.getResponseHandler().send(channel, response);
    }
}