package br.com.microsoft.ocp.bot.service.jmeter.callback.server;

import java.io.InputStream;
import java.nio.charset.Charset;

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.com.microsoft.ocp.bot.service.jmeter.plugin.schemas.Activity;

@Path("/v3")
public class MockChannelCallback {
	private static final Logger log = LoggerFactory.getLogger(MockChannelCallback.class);

	@POST
	@Path("/conversations")
	public Response createConversation() {
		log.info("createConversation()");

		return Response.accepted().build();
	}

	@POST
	@Path("/conversations/{conversationId}/activities")
	@Consumes(MediaType.APPLICATION_JSON)
	public Response sendToConversation(@PathParam("conversationId") String conversationId, Activity activity) {
		log.info(String.format("sendToConversation(conversationId=%d) [Activity Id=%d])", conversationId,
				activity.getId()));
		return Response.accepted().build();
	}

	@POST
	@Path("/conversations/{conversationId}/activities/{activityId}")
	@Consumes(MediaType.APPLICATION_JSON)
	public Response replyToActivity(@PathParam("conversationId") String conversationId,
			@PathParam("activityId") String activityId, InputStream is) {
		log.info(String.format("replyToActivity(conversationId=%s, activityId=%s)", conversationId, activityId));
		String payload;
		try {
			payload = IOUtils.toString(is, Charset.forName("UTF-8"));
			Jsonb jsonb = JsonbBuilder.create();
			Activity activity = jsonb.fromJson(payload, Activity.class);

			if (activity.getType() == "typing") {
				log.info(String.format(
						"Typing response received, ignoging for replyToActivity(conversationId=%s, activityId=%s) [Activity(replyToId=%s)]",
						conversationId, activityId, activity.getReplyToId()));
			} else {
				activity = ActivityParserFactory.parse(activity.getType(), payload, conversationId, activityId);
				activity.setReplyToId(activityId);

				ActivityRequestReply.getInstance().setResponse(activityId, activity);
				log.info(String.format("replyToActivity(conversationId=%s, activityId=%s) [Activity(replyToId=%s)]",
						conversationId, activityId, activity.getReplyToId()));
			}

			return Response.accepted().build();
		} catch (Exception e) {
			log.error("Error in replyToActivity", e);
			return Response.serverError().entity("Error: " + e).build();
		}
	}

	@PUT
	@Path("/conversations/{conversationId}/activities/{activityId}")
	@Consumes(MediaType.APPLICATION_JSON)
	public Response updateActivity(@PathParam("conversationId") String conversationId,
			@PathParam("acitivityId") String activityId, Activity activity) {
		log.info(String.format("replyToActivity(conversationId=%s, activityId=%s)", conversationId, activityId));
		return Response.accepted().build();
	}

	@DELETE
	@Path("/conversations/{conversationId}/activities/{activityId}")
	public Response deleteActivity(@PathParam("conversationId") String conversationId,
			@PathParam("acitivityId") String activityId) {
		log.info(String.format("deleteActivity(conversationId=%s, activityId=%s)", conversationId, activityId));

		return Response.accepted().build();
	}

	@GET
	@Path("/conversations/{conversationId}/members")
	public Response getConversationMembers(@PathParam("conversationId") String conversationId) {
		log.info(String.format("getConversationMembers(conversationId=%s)", conversationId));

		return Response.ok().build();
	}

	@GET
	@Path("/conversations/{conversationId}/activities/{activityId}/members")
	public Response getActivityMembers(@PathParam("conversationId") String conversationId,
			@PathParam("acitivityId") String activityId) {
		log.info(String.format("getActivityMembers(conversationId=%s, activityId=%s)", conversationId));

		return Response.ok().build();
	}

	@POST
	@Path("/conversations/{conversationId}/attachments")
	@Consumes(MediaType.APPLICATION_JSON)
	public Response sendAttachments(@PathParam("conversationId") String conversationId, Activity activity) {
		log.info(String.format("sendAttachments(conversationId=%s)", conversationId));

		return Response.ok().build();
	}

}