static {
   //noinspection ConstantConditions
   COAL_MAP =
       ImmutableBiMap.<CoalType, Integer>builder()
           .put(CoalTypes.COAL, 0)
           .put(CoalTypes.CHARCOAL, 1)
           .build();
   //noinspection ConstantConditions
   COOKED_FISH_MAP =
       ImmutableBiMap.<CookedFish, Integer>builder()
           .put(CookedFishes.COD, 0)
           .put(CookedFishes.SALMON, 1)
           .build();
   //noinspection deprecation, ConstantConditions
   DYE_MAP =
       ImmutableBiMap.<DyeColor, Integer>builder()
           .put(DyeColors.BLACK, (int) org.bukkit.DyeColor.BLACK.getDyeData())
           .put(DyeColors.RED, (int) org.bukkit.DyeColor.RED.getDyeData())
           .put(DyeColors.GREEN, (int) org.bukkit.DyeColor.GREEN.getDyeData())
           .put(DyeColors.BROWN, (int) org.bukkit.DyeColor.BROWN.getDyeData())
           .put(DyeColors.BLUE, (int) org.bukkit.DyeColor.BLUE.getDyeData())
           .put(DyeColors.PURPLE, (int) org.bukkit.DyeColor.PURPLE.getDyeData())
           .put(DyeColors.CYAN, (int) org.bukkit.DyeColor.CYAN.getDyeData())
           .put(DyeColors.SILVER, (int) org.bukkit.DyeColor.SILVER.getDyeData())
           .put(DyeColors.GRAY, (int) org.bukkit.DyeColor.GRAY.getDyeData())
           .put(DyeColors.PINK, (int) org.bukkit.DyeColor.PINK.getDyeData())
           .put(DyeColors.LIME, (int) org.bukkit.DyeColor.LIME.getDyeData())
           .put(DyeColors.YELLOW, (int) org.bukkit.DyeColor.YELLOW.getDyeData())
           .put(DyeColors.LIGHT_BLUE, (int) org.bukkit.DyeColor.LIGHT_BLUE.getDyeData())
           .put(DyeColors.MAGENTA, (int) org.bukkit.DyeColor.MAGENTA.getDyeData())
           .put(DyeColors.ORANGE, (int) org.bukkit.DyeColor.ORANGE.getDyeData())
           .put(DyeColors.WHITE, (int) org.bukkit.DyeColor.WHITE.getDyeData())
           .build();
   //noinspection ConstantConditions
   FISH_MAP =
       ImmutableBiMap.<Fish, Integer>builder()
           .put(Fishes.COD, 0)
           .put(Fishes.SALMON, 1)
           .put(Fishes.CLOWNFISH, 2)
           .put(Fishes.PUFFERFISH, 3)
           .build();
   //noinspection ConstantConditions
   GOLDEN_APPLE_MAP =
       ImmutableBiMap.<GoldenApple, Integer>builder()
           .put(GoldenApples.GOLDEN_APPLE, 0)
           .put(GoldenApples.ENCHANTED_GOLDEN_APPLE, 1)
           .build();
 }
  @SuppressWarnings("deprecation")
  public static Inventory constructInventory(
      TitlesPlugin plugin, Player player, String cat, boolean owned) {
    DataContainer dataContainer = plugin.getDataContainer();
    Inventory inv = null;
    // if there are titles, construct category inventory
    if (!dataContainer.getTitles().isEmpty()) {
      List<String> categories = GetCommands.getCategories(dataContainer);
      List<ItemStack> clickables = new ArrayList<>();

      // get inventory with categories.
      if (cat == null) {

        if (owned) {
          List<Title> unlocked = dataContainer.getUnlockedTitles(player);
          for (Title title : unlocked) {
            ItemStack is;
            String name = title.getName();
            String description = title.getDescription();
            String status;

            if (dataContainer.getCurrentTitle(player) != null
                && dataContainer.getCurrentTitle(player).equals(title)) {
              is = new ItemStack(Material.WOOL, 1, DyeColor.LIME.getData());
              status = "Current";
            } else {
              is = new ItemStack(Material.WOOL, 1, DyeColor.GREEN.getData());
              status = "Unlocked";
            }
            ItemMeta meta = is.getItemMeta();
            meta.setDisplayName(name);
            meta.setLore(
                Arrays.asList(
                    "Description: " + description,
                    "Category: " + title.getCategory().getName(),
                    "Status: " + status));
            is.setItemMeta(meta);
            clickables.add(is);
          }

          int size = ((clickables.size() / 9) + 1) * 9;
          inv =
              Bukkit.createInventory(
                  null, size, ChatColor.DARK_AQUA + "" + ChatColor.BOLD + "Unlocked Titles");

          for (int i = 0; i < clickables.size(); i++) inv.setItem(i, clickables.get(i));

          // back button
          ItemStack is = new ItemStack(Material.WOOL, 1, DyeColor.GRAY.getData());
          ItemMeta meta = is.getItemMeta();
          meta.setDisplayName("Back");
          is.setItemMeta(meta);
          inv.setItem(inv.getSize() - 1, is);
          return inv;
        }

        for (String category : categories) {
          ItemStack is = new ItemStack(Material.WOOL, 1, DyeColor.GRAY.getData());
          ItemMeta meta = is.getItemMeta();
          meta.setDisplayName(category);
          is.setItemMeta(meta);
          clickables.add(is);
        }
        int size = ((clickables.size() / 9) + 1) * 9;
        inv =
            Bukkit.createInventory(
                null, size, ChatColor.DARK_AQUA + "" + ChatColor.BOLD + "Title categories");

        // get inventory with titles from category.
      } else {
        Category category = dataContainer.getCategory(cat);
        if (category == null) return null;
        List<Title> titles = dataContainer.getTitlesFromCategory(category);
        List<Title> ownedTitles = dataContainer.getUnlockedTitles(player);

        for (Title title : titles) {
          ItemStack is;
          String name = title.getName();
          String description = title.getDescription();
          String status;

          if (ownedTitles.contains(title)) {
            if (dataContainer.getCurrentTitle(player) != null
                && dataContainer.getCurrentTitle(player).equals(title)) {
              is = new ItemStack(Material.WOOL, 1, DyeColor.LIME.getData());
              status = "Current";
            } else {
              is = new ItemStack(Material.WOOL, 1, DyeColor.GREEN.getData());
              status = "Unlocked";
            }
          } else {
            Request request = dataContainer.getRequest(player);
            if (request != null
                && request.getTitle().equals(title)
                && request.getStatus() == RequestStatus.pending) {
              is = new ItemStack(Material.WOOL, 1, DyeColor.ORANGE.getData());
              status = "Pending";
            } else {
              is = new ItemStack(Material.WOOL, 1, DyeColor.RED.getData());
              status = "Locked";
            }
          }

          ItemMeta meta = is.getItemMeta();
          meta.setDisplayName(name);
          meta.setLore(
              Arrays.asList(
                  "Description: " + description,
                  "Category: " + category.getName(),
                  "Status: " + status));
          is.setItemMeta(meta);
          clickables.add(is);
        }
        int size = ((clickables.size() / 9) + 1) * 9;
        inv =
            Bukkit.createInventory(
                null, size, ChatColor.DARK_AQUA + "" + ChatColor.BOLD + "Titles in category");
      }

      for (int i = 0; i < clickables.size(); i++) inv.setItem(i, clickables.get(i));

      // back button
      if (cat != null) {
        ItemStack is = new ItemStack(Material.WOOL, 1, DyeColor.GRAY.getData());
        ItemMeta meta = is.getItemMeta();
        meta.setDisplayName("Back");
        is.setItemMeta(meta);
        inv.setItem(inv.getSize() - 1, is);

        // player's unlocked titles
      } else {
        ItemStack is = new ItemStack(Material.WOOL, 1, DyeColor.GREEN.getData());
        ItemMeta meta = is.getItemMeta();
        meta.setDisplayName("Unlocked");
        is.setItemMeta(meta);
        inv.setItem(inv.getSize() - 1, is);
      }

    } else Utils.sendError(player, "There are no titles yet.");
    return inv;
  }