package org.jboss.resteasy.test.asynch.resource;

import org.jboss.logging.Logger;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;

@Path("/")
public class JaxrsAsyncResource {
    @GET
    @Produces("text/plain")
    public void get(@Suspended final AsyncResponse response) {
        response.setTimeout(10000, TimeUnit.MILLISECONDS);
        Thread t = new Thread() {
            private Logger logger = Logger.getLogger(JaxrsAsyncResource.class);

            @Override
            public void run() {
                try {
                    logger.info("Get thread started.");
                    Thread.sleep(100);
                    Response jaxrs = Response.ok("hello").type(MediaType.TEXT_PLAIN).build();
                    response.resume(jaxrs);
                } catch (Exception e) {
                    StringWriter errors = new StringWriter();
                    e.printStackTrace(new PrintWriter(errors));
                    logger.error(errors.toString());
                }
            }
        };
        t.start();
    }

    @GET
    @Path("timeout")
    @Produces("text/plain")
    public void timeout(@Suspended final AsyncResponse response) {
        response.setTimeout(100, TimeUnit.MILLISECONDS);
        Thread t = new Thread() {
            private Logger logger = Logger.getLogger(JaxrsAsyncResource.class);

            @Override
            public void run() {
                try {
                    logger.info("Timeout thread started.");
                    Thread.sleep(1000);
                    Response jaxrs = Response.ok("hello").type(MediaType.TEXT_PLAIN).build();
                    response.resume(jaxrs);
                } catch (Exception e) {
                    StringWriter errors = new StringWriter();
                    e.printStackTrace(new PrintWriter(errors));
                    logger.error(errors.toString());
                }
            }
        };
        t.start();
    }

    @GET
    @Path("negative")
    @Produces("text/plain")
    public void negative(@Suspended final AsyncResponse response) {
        response.setTimeout(-1, TimeUnit.MILLISECONDS);
        Thread t = new Thread() {
            private Logger logger = Logger.getLogger(JaxrsAsyncResource.class);
            @Override
            public void run() {
                try {
                    logger.info("Started");
                    Thread.sleep(1000);
                    Response jaxrs = Response.ok("hello").type(MediaType.TEXT_PLAIN).build();
                    response.resume(jaxrs);
                } catch (Exception e) {
                    StringWriter errors = new StringWriter();
                    e.printStackTrace(new PrintWriter(errors));
                    logger.error(errors.toString());
                }
            }
        };
        t.start();
    }

    @GET
    @Path("zero")
    @Produces("text/plain")
    public void zero(@Suspended final AsyncResponse response) {
        response.setTimeout(0, TimeUnit.MILLISECONDS);
        Thread t = new Thread() {
            private Logger logger = Logger.getLogger(JaxrsAsyncResource.class);
            @Override
            public void run() {
                try {
                    logger.info("Started");
                    Thread.sleep(1000);
                    Response jaxrs = Response.ok("hello").type(MediaType.TEXT_PLAIN).build();
                    response.resume(jaxrs);
                } catch (Exception e) {
                    StringWriter errors = new StringWriter();
                    e.printStackTrace(new PrintWriter(errors));
                    logger.error(errors.toString());
                }
            }
        };
        t.start();
    }
}
