package testapp.endpoint;

import act.app.ActionContext;
import act.controller.Controller;
import org.osgl.exception.UnexpectedException;
import org.osgl.mvc.annotation.After;
import org.osgl.mvc.annotation.Before;
import org.osgl.mvc.annotation.Catch;
import org.osgl.mvc.annotation.GetAction;
import org.osgl.mvc.result.BadRequest;
import org.osgl.mvc.result.Result;

@Controller("/aop")
@SuppressWarnings("unused")
public class InterceptorTestController extends Controller.Util {

    @Catch(Exception.class)
    public Result handleException(Exception e) {
        return text("bar-" + e.getMessage());
    }

    @Before
    public void validate(int n) {
        if (n < 0) {
            throw new BadRequest();
        }
    }

    @GetAction("foo")
    public int foo(int n) {
        return n;
    }

    @GetAction("bar")
    public int bar(int n) throws Exception {
        if (n % 2 == 0) {
            throw new ArrayIndexOutOfBoundsException("array:" + n);
        } else if (n % 3 == 0) {
            throw new UnexpectedException("unexpected:%s", n);
        } else {
            throw new Exception("exception:" + n);
        }
    }

    @Catch(UnexpectedException.class)
    public Result handleUnexpectedException(UnexpectedException e) {
        return text(e.getMessage());
    }

    @Catch(ArrayIndexOutOfBoundsException.class)
    public Result handleArrayIndexOutOfBoundsException(ArrayIndexOutOfBoundsException e) {
        return text(e.getMessage());
    }

    @After
    public void decorate(Result result, ActionContext context) {
        context.resp().addHeader("foo-code", String.valueOf(result.statusCode()));
    }

}
