package dst.ass3.messaging.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import dst.ass3.messaging.Constants;
import dst.ass3.messaging.IRequestGateway;
import dst.ass3.messaging.UploadRequest;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class RequestGateway implements IRequestGateway {
    Connection conn;
    Channel channel;

    public RequestGateway() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(Constants.RMQ_HOST);
        factory.setPort(Integer.parseInt(Constants.RMQ_PORT));
        factory.setUsername(Constants.RMQ_USER);
        factory.setPassword(Constants.RMQ_PASSWORD);

        try {
            conn = factory.newConnection();
            channel = conn.createChannel();
        } catch (IOException | TimeoutException e) {
            throw new RuntimeException("Irrecoverable error", e); // Fail horribly
        }
    }

    @Override
    public void uploadRequest(UploadRequest request) {
        String routingKey = null;
        switch (request.getType()) {
            case DOCUMENT:
                routingKey = Constants.QUEUE_DOCUMENT;
                break;
            case QUIZ:
                routingKey = Constants.QUEUE_QUIZ;
                break;
            case VIDEO:
                routingKey = Constants.QUEUE_VIDEO;
                break;
        }

        ObjectMapper mapper = new ObjectMapper();
        try {
            channel.basicPublish("", routingKey, false, false, MessageProperties.BASIC, mapper.writeValueAsBytes(request));
        } catch (IOException e) {
            e.printStackTrace(); // TODO: may be recoverable?
        }
    }

    @Override
    public void close() throws IOException {
        try {
            channel.close();
        } catch (TimeoutException ignored) {
        }
        conn.close();
    }
}
