package io.robe.admin.resources;

import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.json.MetricsModule;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.Inject;
import io.dropwizard.hibernate.UnitOfWork;
import io.dropwizard.setup.Environment;
import io.robe.auth.Credentials;
import io.robe.auth.RobeAuth;
import org.hibernate.FlushMode;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.concurrent.TimeUnit;

@Path("metrics")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MetricsResource {


    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(
            new MetricsModule(
                    TimeUnit.SECONDS,
                    TimeUnit.SECONDS,
                    false,
                    MetricFilter.ALL));
    @Inject
    Environment environment;

    @GET
    @UnitOfWork(transactional = false, readOnly = true, flushMode = FlushMode.MANUAL)
    public Response get(@RobeAuth Credentials credentials) {
        Response.ResponseBuilder builder = Response.ok();
        builder.status(Response.Status.ACCEPTED);
        try {
            builder.entity(OBJECT_MAPPER.writeValueAsString(environment.metrics()));
        } catch (JsonProcessingException e) {
            builder.status(Response.Status.INTERNAL_SERVER_ERROR);
            e.printStackTrace();
        }
        return builder.build();
    }


}