package at.ac.tuwien.lsdc.federation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import at.ac.tuwien.lsdc.JobGenerator;
import at.ac.tuwien.lsdc.SchedSimulator;
import at.ac.tuwien.lsdc.sched.AbstractScheduler;
import at.ac.tuwien.lsdc.sched.SchedulerB;
import at.ac.tuwien.lsdc.types.Application;

/**
 * Cloudpartners management. Class to be used to ask cloudpartners to take one
 * of our APPs over to their infrastructure.
 * 
 * @author jan
 * 
 */
public class Federation {
	/**
	 * Logger.
	 */
	private static final Logger LOG = LoggerFactory.getLogger(SchedulerB.class);

	private int numPartners;

	public Federation(int numPartners) {
		this.numPartners = numPartners;
	}

	/**
	 * Try to outsource app.
	 * 
	 * @param app
	 *            Application to outsource.
	 * @return true, if application can be outsourced.
	 */
	public boolean askToOutsource(Application app) {
		if ((Math.random() * 100) < (10 * numPartners)) {
			LOG.info("Outsource:" + app);
			return true;
		}
		return false;
	}

	/**
	 * Try to insource app.
	 * 
	 * @return application to be insourced.
	 */
	public Application askToInsource() {
		int size;
		int ram;
		int cpu;
		int duration;
		
		long timestamp = AbstractScheduler.getCurrentTime() + JobGenerator.randomInt(1, 3);

		if ((Math.random() * 100) < (10 * numPartners)) {
			LOG.info("Insource app ");
			switch (SchedSimulator.getScenario()) {
				case A :
					size = JobGenerator.randomInt(20, 100);
					ram = JobGenerator.randomInt(30, 50);
					cpu = JobGenerator.randomInt(50, 100);
					duration = JobGenerator.randomInt(1, 50);
					return new Application(timestamp, size, ram, cpu, duration);
				case B :
					size = JobGenerator.randomInt(150, 500);
					ram = JobGenerator.randomInt(100, 700);
					cpu = JobGenerator.randomInt(100, 400);
					duration = JobGenerator.randomInt(1, 50);
					return new Application(timestamp, size, ram, cpu, duration);
				default :
					size = JobGenerator.randomInt(20, 500);
					ram = JobGenerator.randomInt(30, 700);
					cpu = JobGenerator.randomInt(50, 400);
					duration = JobGenerator.randomInt(1, 50);
					return new Application(timestamp, size, ram, cpu, duration);
			}
		}
		return null;
	}
}
