package openperipheral.integration.ic2;

import com.google.common.base.Preconditions;
import ic2.api.reactor.IReactor;
import ic2.api.reactor.IReactorChamber;
import openperipheral.api.adapter.Asynchronous;
import openperipheral.api.adapter.IPeripheralAdapter;
import openperipheral.api.adapter.method.ReturnType;
import openperipheral.api.adapter.method.ScriptCallable;

@Asynchronous
public class AdapterReactorChamber implements IPeripheralAdapter {

	@Override
	public Class<?> getTargetClass() {
		return IReactorChamber.class;
	}

	@Override
	public String getSourceId() {
		return "ic2_chamber";
	}

	private static IReactor getReactor(IReactorChamber chamber) {
		IReactor reactor = chamber.getReactor();
		Preconditions.checkNotNull(reactor, "No reactor");
		return reactor;
	}

	@ScriptCallable(description = "Check if reactor is in valid state", returnTypes = ReturnType.BOOLEAN)
	public boolean isValid(IReactorChamber chamber) {
		return chamber.getReactor() != null;
	}

	@ScriptCallable(description = "Get the heat of the reactor", returnTypes = ReturnType.NUMBER)
	public int getHeat(IReactorChamber chamber) {
		return getReactor(chamber).getHeat();
	}

	@ScriptCallable(description = "Get the maximum heat of the reactor before it explodes", returnTypes = ReturnType.NUMBER)
	public int getMaxHeat(IReactorChamber chamber) {
		return getReactor(chamber).getMaxHeat();
	}

	@ScriptCallable(description = "Get the EU output of this reactor", returnTypes = ReturnType.NUMBER)
	public float getEUOutput(IReactorChamber chamber) {
		return getReactor(chamber).getReactorEnergyOutput();
	}

	@ScriptCallable(description = "Returns true if the reactor is active", returnTypes = ReturnType.BOOLEAN)
	public boolean isActive(IReactorChamber chamber) {
		return getReactor(chamber).produceEnergy();
	}
}