content: package emu.grasscutter.game.props.ItemUseAction;
  
  import emu.grasscutter.data.common.ItemUseData;
  import emu.grasscutter.game.props.ItemUseOp;
  
  public class ItemUseAction {
      public ItemUseOp getItemUseOp() {
          return ItemUseOp.ITEM_USE_NONE;
      }
  
      public static ItemUseAction fromItemUseData(ItemUseData data) {
          var useParam = data.getUseParam();
          return switch (data.getUseOp()) {
              case ITEM_USE_NONE -> null;
              // Uprade materials - no direct usage
              case ITEM_USE_ADD_EXP -> new ItemUseAddExp(useParam);
              case ITEM_USE_ADD_RELIQUARY_EXP -> new ItemUseAddReliquaryExp(useParam);
              case ITEM_USE_ADD_WEAPON_EXP -> new ItemUseAddWeaponExp(useParam);
              // Energy pickups
              case ITEM_USE_ADD_ALL_ENERGY -> new ItemUseAddAllEnergy(useParam);
              case ITEM_USE_ADD_ELEM_ENERGY -> new ItemUseAddElemEnergy(useParam);
              // Give items
              case ITEM_USE_ADD_ITEM -> new ItemUseAddItem(useParam);
              case ITEM_USE_GAIN_AVATAR -> new ItemUseGainAvatar(useParam);
              case ITEM_USE_GAIN_COSTUME -> new ItemUseGainCostume(useParam);  // TODO - real success/fail
              case ITEM_USE_GAIN_FLYCLOAK -> new ItemUseGainFlycloak(useParam);  // TODO - real success/fail
              case ITEM_USE_GAIN_NAME_CARD -> new ItemUseGainNameCard(useParam);
              case ITEM_USE_CHEST_SELECT_ITEM -> new ItemUseChestSelectItem(useParam);
              case ITEM_USE_ADD_SELECT_ITEM -> new ItemUseAddSelectItem(useParam);
              case ITEM_USE_GRANT_SELECT_REWARD -> new ItemUseGrantSelectReward(useParam);
              case ITEM_USE_COMBINE_ITEM -> new ItemUseCombineItem(useParam);
              case ITEM_USE_OPEN_RANDOM_CHEST -> new ItemUseOpenRandomChest(useParam);
              // Food effects
              case ITEM_USE_RELIVE_AVATAR -> new ItemUseReliveAvatar(useParam);  // First action for revival food. Should we worry about race conditions in parallel streams?
              case ITEM_USE_ADD_CUR_HP -> new ItemUseAddCurHp(useParam);
              case ITEM_USE_ADD_CUR_STAMINA -> new ItemUseAddCurStamina(useParam);
              case ITEM_USE_ADD_SERVER_BUFF -> new ItemUseAddServerBuff(useParam);
              case ITEM_USE_MAKE_GADGET -> new ItemUseMakeGadget(useParam);
              // Unlock recipes - TODO: allow scheduling packets for after recipe is removed
              case ITEM_USE_UNLOCK_COMBINE -> new ItemUseUnlockCombine(useParam);
              case ITEM_USE_UNLOCK_CODEX -> new ItemUseUnlockCodex(useParam);  // TODO: No backend for this yet
              case ITEM_USE_UNLOCK_COOK_RECIPE -> new ItemUseUnlockCookRecipe(useParam);
              case ITEM_USE_UNLOCK_FORGE -> new ItemUseUnlockForge(useParam);
              case ITEM_USE_UNLOCK_FURNITURE_FORMULA -> new ItemUseUnlockFurnitureFormula(useParam);
              case ITEM_USE_UNLOCK_FURNITURE_SUITE -> new ItemUseUnlockFurnitureSuite(useParam);
              case ITEM_USE_UNLOCK_HOME_MODULE -> new ItemUseUnlockHomeModule(useParam);  // No backend for this yet
              case ITEM_USE_UNLOCK_HOME_BGM -> new ItemUseUnlockHomeBgm(useParam);
              // Account things
              case ITEM_USE_ACCEPT_QUEST -> new ItemUseAcceptQuest(useParam);
              case ITEM_USE_GAIN_CARD_PRODUCT -> new ItemUseGainCardProduct(useParam);
              case ITEM_USE_UNLOCK_PAID_BATTLE_PASS_NORMAL -> new ItemUseUnlockPaidBattlePassNormal(useParam);  // TODO: add paid BP
  
              // Unused in current resources
              case ITEM_USE_DEL_SERVER_BUFF -> null;
              case ITEM_USE_ADD_BIG_TALENT_POINT -> null;
              case ITEM_USE_GAIN_RESIN_CARD_PRODUCT -> null;
              case ITEM_USE_TRIGGER_ABILITY -> null;
              case ITEM_USE_ADD_TREASURE_MAP_BONUS_REGION_FRAGMENT -> null;
              // Used in current resources but no point yet
              case ITEM_USE_ADD_PERSIST_STAMINA -> null;  // [int amount] one Test item
              case ITEM_USE_ADD_TEMPORARY_STAMINA -> null;  // [int amount] one Test item
              case ITEM_USE_ADD_DUNGEON_COND_TIME -> null;  // [int 1, int 15 or 20] - minigame shards
              case ITEM_USE_ADD_CHANNELLER_SLAB_BUFF -> null;  // [int] minigame buffs
              case ITEM_USE_ADD_REGIONAL_PLAY_VAR -> null;  // [String, int] - coral butterfly effect
          };
      }
  
      public boolean useItem(UseItemParams params) {
          // An item must return true on at least one of its actions to count as successfully used.
          // If all of the actions return false, the item will not be consumed from inventory.
          return false;
      }
  
      public boolean postUseItem(UseItemParams params) {
          // This is run after the item has been consumed from inventory.
          return false;
      }
  }
  