package com.gmail.zahusek.tinyprotocolapi.api.tab;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.UUID;
import com.gmail.zahusek.tinyprotocolapi.TinyProtocolAPI;
import com.gmail.zahusek.tinyprotocolapi.api.Preference;
import com.gmail.zahusek.tinyprotocolapi.packet.Packet;
import com.gmail.zahusek.tinyprotocolapi.packet.PacketHeaderFooter;
import com.gmail.zahusek.tinyprotocolapi.packet.PacketPlayerInfo;
import com.gmail.zahusek.tinyprotocolapi.wrapper.WrapperEnum.GameType;
import com.gmail.zahusek.tinyprotocolapi.wrapper.WrapperEnum.InfoAction;
import com.gmail.zahusek.tinyprotocolapi.wrapper.WrapperInfoData;
import com.mojang.authlib.GameProfile;
public class TabHolder implements TabModify
{
final int x = 4, y = 20;
final GameProfile[][] profile = new GameProfile[x][y];
final String uuid = "00000000-0000-%s-0000-000000000000";
final String token = "!@#$^*";
final GameType gamemode = GameType.NOT_SET;
Class<?> plugin;
Preference priority;
boolean exist = false;
String[][] message = new String[x][y];
boolean[][] xmessage = new boolean[x][y];
int[][] signal = new int[x][y];
boolean[][] xsignal = new boolean[x][y];
String[][] texture = new String[x][y];
boolean[][] xtexture = new boolean[x][y];
String _message = "";
int _signal = 0;
String _texture = "MHF_Question";
final PacketPlayerInfo remove = new PacketPlayerInfo(InfoAction.REMOVE_PLAYER);
final PacketHeaderFooter hnf = new PacketHeaderFooter();
TabHolder()
{
final LinkedList<WrapperInfoData> xdefault = new LinkedList<>();
for(int x = 0; x < this.x; x++)
{
for(int y = 0; y < this.y; y++)
{
String idx = digit(x);
String idy = digit(y);
GameProfile profile = this.profile[x][y] = new GameProfile(UUID.fromString(String.format(uuid, idx + idy)), token + idx + token + idy);
xdefault.add(new WrapperInfoData(profile, _signal, gamemode, _message));
}
}
remove.addAll(xdefault);
reset();
}
protected Packet[] update()
{
final PacketPlayerInfo add = new PacketPlayerInfo(InfoAction.ADD_PLAYER);
final PacketPlayerInfo display = new PacketPlayerInfo(InfoAction.UPDATE_DISPLAY_NAME);
final PacketPlayerInfo latency = new PacketPlayerInfo(InfoAction.UPDATE_LATENCY);
for(int x = 0; x < this.x; x++)
{
for(int y = 0; y < this.y; y++)
{
WrapperInfoData data = new WrapperInfoData(profile[x][y], signal[x][y], gamemode, message[x][y]);
if(!exist || !xtexture[x][y])
{
data.setTexture(texture[x][y]);
add.add(data);
xtexture[x][y] = true;
}
if(!xmessage[x][y])
{
display.add(data);
xmessage[x][y] = true;
}
if(!xsignal[x][y])
{
latency.add(data);
xsignal[x][y] = true;
}
}
}
exist = true;
return new Packet[] {add, display, latency};
}
protected Packet[] remove()
{
reset();
return new Packet[] {hnf, remove};
}
@Override
public void setMessage(int x, int y, String message) {
if(this.message[x][y].equals(message)) return;
this.message[x][y] = message;
xmessage[x][y] = false;
}
@Override
public void setTexture(int x, int y, String texture) {
if(this.texture[x][y].equals(texture))return;
this.texture[x][y] = texture;
xtexture[x][y] = false;
}
@Override
public void setSignal(int x, int y, int signal)
{
if(this.signal[x][y] == signal) return;
this.signal[x][y] = signal;
xsignal[x][y] = false;
}
@Override
public void setTexture(String texture) {
for(int x = 0; x < this.x; x++)
for(int y = 0; y < this.y; y++)
setTexture(x, y, texture);
}
@Override
public void setSignal(int signal) {
for(int x = 0; x < this.x; x++)
for(int y = 0; y < this.y; y++)
setSignal(x, y, signal);
}
@Override
public void set(int x, int y, String message, String texture) {
setMessage(x, y, message);
setTexture(x, y, texture);
}
@Override
public void set(int x, int y, String message, int signal) {
setMessage(x, y, message);
setSignal(x, y, signal);
}
@Override
public void set(int x, int y, String message, String texture, int signal) {
setMessage(x, y, message);
setSignal(x, y, signal);
setTexture(x, y, texture);
}
@Override
public void setHeader(Collection<String> header) {
if(header == null || header.isEmpty())
return;
String[] head = header.toArray(new String[header.size()]);
StringBuilder text = new StringBuilder();
text.append(head[0] == null ? _message : head[0]);
for(int i = 1; i < head.length; i++)
text.append("\n" + head[i]);
hnf.setHeader(text.toString());
}
@Override
public void setFooter(Collection<String> footer) {
if(footer == null || footer.isEmpty())
return;
String[] foot = footer.toArray(new String[footer.size()]);
StringBuilder text = new StringBuilder();
text.append(foot[0] == null ? _message : foot[0]);
for(int i = 1; i < foot.length; i++)
text.append("\n" + foot[i]);
hnf.setFooter(text.toString());
}
@Override
public void set(Collection<String> header, Collection<String> footer) {
setHeader(header);
setFooter(footer);
}
@Override
public String getMessage(int x, int y) {
return message[x][y];
}
@Override
public String getTexture(int x, int y) {
return texture[x][y];
}
@Override
public int getSignal(int x, int y) {
return signal[x][y];
}
@Override
public ArrayList<String> getHeader() {
ArrayList<String> head = new ArrayList<>();
String[] text = hnf.getHeader().split("\n");
for(String line : text)
head.add(line);
return head;
}
@Override
public ArrayList<String> getFooter() {
ArrayList<String> foot = new ArrayList<>();
String[] text = hnf.getFooter().split("\n");
for(String line : text)
foot.add(line);
return foot;
}
protected void reset()
{
plugin = TinyProtocolAPI.class;
priority = Preference.LOW;
for(int x = 0; x < this.x; x++)
{
for(int y = 0; y < this.y; y++)
{
message[x][y] = _message;
signal[x][y] = _signal;
texture[x][y] = _texture;
}
}
hnf.setFooter(_message);
hnf.setHeader(_message);
exist = false;
}
protected void takeOver(Class<?> a, Preference b)
{
this.plugin = a;
this.priority = b;
}
String digit (int i)
{return i > 9 ? "" + i : "0" + i;}
}