/*
* This file is part of MyPet
*
* Copyright © 2011-2016 Keyle
* MyPet is licensed under the GNU Lesser General Public License.
*
* MyPet is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MyPet is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.Keyle.MyPet.util.selectionmenu;
import com.google.common.base.Optional;
import de.Keyle.MyPet.MyPetApi;
import de.Keyle.MyPet.api.WorldGroup;
import de.Keyle.MyPet.api.entity.StoredMyPet;
import de.Keyle.MyPet.api.player.MyPetPlayer;
import de.Keyle.MyPet.api.repository.RepositoryCallback;
import de.Keyle.MyPet.api.util.inventory.IconMenu;
import de.Keyle.MyPet.api.util.inventory.IconMenuItem;
import de.Keyle.MyPet.api.util.locale.Translation;
import de.Keyle.MyPet.api.util.service.types.EggIconService;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.*;
import static org.bukkit.ChatColor.GOLD;
import static org.bukkit.ChatColor.RESET;
public class MyPetSelectionGui {
MyPetPlayer player;
String title;
public MyPetSelectionGui(MyPetPlayer player) {
this(player, Translation.getString("Message.SelectMyPet", player));
}
public MyPetSelectionGui(MyPetPlayer player, String title) {
this.player = player;
this.title = title;
}
public void open(final RepositoryCallback<StoredMyPet> callback) {
MyPetApi.getRepository().getMyPets(player, new RepositoryCallback<List<StoredMyPet>>() {
@Override
public void callback(List<StoredMyPet> pets) {
open(pets, callback);
}
});
}
public void open(List<StoredMyPet> pets, final RepositoryCallback<StoredMyPet> callback) {
open(pets, 1, callback);
}
public void open(final List<StoredMyPet> pets, int page, final RepositoryCallback<StoredMyPet> callback) {
if (pets.size() > 0) {
if (page < 1 || Math.ceil(pets.size() / 45.) < page) {
page = 1;
}
final Map<Integer, StoredMyPet> petSlotList = new HashMap<>();
WorldGroup wg = WorldGroup.getGroupByWorld(player.getPlayer().getWorld().getName());
Iterator<StoredMyPet> iterator = pets.iterator();
while (iterator.hasNext()) {
StoredMyPet mypet = iterator.next();
if (mypet.getWorldGroup().equals("") || !mypet.getWorldGroup().equals(wg.getName())) {
iterator.remove();
}
if (player.hasMyPet() && player.getMyPet().getUUID().equals(mypet.getUUID())) {
iterator.remove();
}
}
final int previousPage = page == 1 ? (int) Math.ceil(pets.size() / 45.) : page - 1;
final int nextPage = page == Math.ceil(pets.size() / 45.) ? 1 : page + 1;
IconMenu menu = new IconMenu(title, new IconMenu.OptionClickEventHandler() {
@Override
public void onOptionClick(IconMenu.OptionClickEvent event) {
if (event.getPosition() == 45) {
new BukkitRunnable() {
@Override
public void run() {
open(pets, previousPage, callback);
}
}.runTaskLater(MyPetApi.getPlugin(), 1L);
} else if (event.getPosition() == 53) {
new BukkitRunnable() {
@Override
public void run() {
open(pets, nextPage, callback);
}
}.runTaskLater(MyPetApi.getPlugin(), 1L);
} else if (event.getPosition() > 45) {
return;
} else if (petSlotList.containsKey(event.getPosition())) {
StoredMyPet storedMyPet = petSlotList.get(event.getPosition());
if (storedMyPet != null && callback != null) {
callback.callback(storedMyPet);
}
}
event.setWillClose(true);
event.setWillDestroy(true);
}
}, MyPetApi.getPlugin());
int pagePets = pets.size() - (page - 1) * 45;
for (int i = 0; i < pagePets && i <= 45; i++) {
StoredMyPet mypet = pets.get(i + ((page - 1) * 45));
List<String> lore = new ArrayList<>();
lore.add(RESET + Translation.getString("Name.Hunger", player) + ": " + GOLD + Math.round(mypet.getSaturation()));
if (mypet.getRespawnTime() > 0) {
lore.add(RESET + Translation.getString("Name.Respawntime", player) + ": " + GOLD + mypet.getRespawnTime() + "sec");
} else {
lore.add(RESET + Translation.getString("Name.HP", player) + ": " + GOLD + String.format("%1.2f", mypet.getHealth()));
}
lore.add(RESET + Translation.getString("Name.Exp", player) + ": " + GOLD + String.format("%1.2f", mypet.getExp()));
lore.add(RESET + Translation.getString("Name.Type", player) + ": " + GOLD + Translation.getString("Name." + mypet.getPetType().name(), player));
lore.add(RESET + Translation.getString("Name.Skilltree", player) + ": " + GOLD + (mypet.getSkilltree() != null ? mypet.getSkilltree().getDisplayName() : "-"));
IconMenuItem icon = new IconMenuItem();
icon.setTitle(RESET + mypet.getPetName());
icon.addLore(lore);
Optional<EggIconService> egg = MyPetApi.getServiceManager().getService(EggIconService.class);
if (egg.isPresent()) {
egg.get().updateIcon(mypet.getPetType(), icon);
}
int pos = menu.addOption(icon);
petSlotList.put(pos, mypet);
}
if (previousPage != page) {
menu.setOption(45, new IconMenuItem()
.setMaterial(Material.SIGN)
.setTitle("" + previousPage + " ≪≪")
);
}
if (previousPage != page) {
menu.setOption(53, new IconMenuItem()
.setMaterial(Material.SIGN)
.setTitle(ChatColor.BOLD + "≫≫ " + ChatColor.RESET + nextPage)
);
}
menu.open(player.getPlayer());
}
}
}