package theGhastModding.GoSBuilder.main;

import java.util.ArrayList;
import java.util.List;

public class BigByteList {
	
	private List<List<Byte>> bigList;
	
	public BigByteList(){
		bigList = new ArrayList<List<Byte>>();
		bigList.add(new ArrayList<Byte>());
		bigList.add(new ArrayList<Byte>());
		bigList.add(new ArrayList<Byte>());
	}
	
	public List<byte[]> asArrays(){
		List<byte[]> toReturn = new ArrayList<byte[]>();
		if(bigList.get(0).isEmpty() == false){
			toReturn.add(new byte[bigList.get(0).size()]);
			for(int i = 0; i < bigList.get(0).size(); i++){
				toReturn.get(0)[i] = bigList.get(0).get(i);
			}
		}
		if(bigList.get(1).isEmpty() == false){
			toReturn.add(new byte[bigList.get(1).size()]);
			for(int i = 0; i < bigList.get(1).size(); i++){
				toReturn.get(1)[i] = bigList.get(1).get(i);
			}
		}
		if(bigList.get(2).isEmpty() == false){
			toReturn.add(new byte[bigList.get(2).size()]);
			for(int i = 0; i < bigList.get(2).size(); i++){
				toReturn.get(2)[i] = bigList.get(2).get(i);
			}
		}
		return toReturn;
	}
	
	public void addValue(byte value) throws Exception {
		try {
			if(bigList.get(0).size() < Integer.MAX_VALUE){
				bigList.get(0).add(value);
				return;
			}
			if(bigList.get(1).size() < Integer.MAX_VALUE){
				bigList.get(1).add(value);
				return;
			}
			if(bigList.get(2).size() < Integer.MAX_VALUE){
				bigList.get(2).add(value);
				return;
			}
		} catch(Exception e){
			throw e;
		}
	}
	
	public byte getValue(long value) throws Exception {
		try {
			if(value < 0){
				return (byte)-1;
			}
			if(value <= Integer.MAX_VALUE){
				return bigList.get(0).get((int)value);
			}
			if(value > Integer.MAX_VALUE && value <= (long)Integer.MAX_VALUE * 2L){
				return bigList.get(1).get((int)(value - Integer.MAX_VALUE));
			}
			if(value > (long)Integer.MAX_VALUE * 2L &&  value <= (long)Integer.MAX_VALUE * 3L){
				return bigList.get(2).get((int)(value - (long)Integer.MAX_VALUE * 2L));
			}
			return (byte)-1;
		} catch(Exception e){
			throw e;
		}
	}
	
}