package com.github.xetorthio.jedisque;

import redis.clients.jedis.Protocol;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.util.SafeEncoder;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;

public class BinaryJedisque extends redis.clients.jedis.Connection {
	static final private int DISQUE_PORT = 7711;
	private final List<URI> uris = new ArrayList<URI>();
	private Random randomGenerator = new Random();

	public BinaryJedisque() {
		try {
			uris.add(new URI("disque://localhost:" + DISQUE_PORT));
		} catch (URISyntaxException e) {
		}
	}

	public BinaryJedisque(URI... uris) {
		this.uris.addAll(Arrays.asList(uris));
	}

	@Override
	public void connect() {
		while (!this.isConnected()) {
			if (uris.size() == 0) {
				throw new JedisConnectionException("Could not connect to any of the provided nodes");
			}
			int index = randomGenerator.nextInt(uris.size());

			try {
				URI uri = uris.get(index);
				setHost(uri.getHost());
				setPort(uri.getPort());
				super.connect();
			} catch (JedisConnectionException e) {
				uris.remove(index);
			}
		}
	}

	public String addJob(byte[] queueName, byte[] job, long mstimeout) {
		sendCommand(Command.ADDJOB, queueName, job, Protocol.toByteArray(mstimeout));
		return getBulkReply();
	}

	public String addJob(byte[] queueName, byte[] job, long mstimeout, JobParams params) {
		List<byte[]>addJobCommand = new ArrayList<byte[]>();
		addJobCommand.add(queueName);
		addJobCommand.add(job);
		addJobCommand.add(Protocol.toByteArray(mstimeout));
		addJobCommand.addAll(params.getParams());
		sendCommand(Command.ADDJOB, addJobCommand.toArray(new byte[addJobCommand.size()][]));
		return getBulkReply();
	}


}