/*
 * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
 * Copyright (C) 2016-2021 ViaVersion and contributors
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.viaversion.viaversion.api.entities;

import com.viaversion.viaversion.util.EntityTypeUtil;

public enum Entity1_15Types implements EntityType {

    ENTITY(-1),

    AREA_EFFECT_CLOUD(0, ENTITY),
    END_CRYSTAL(18, ENTITY),
    EVOKER_FANGS(22, ENTITY),
    EXPERIENCE_ORB(24, ENTITY),
    EYE_OF_ENDER(25, ENTITY),
    FALLING_BLOCK(26, ENTITY),
    FIREWORK_ROCKET(27, ENTITY),
    ITEM(35, ENTITY),
    LLAMA_SPIT(40, ENTITY),
    TNT(59, ENTITY),
    SHULKER_BULLET(64, ENTITY),
    FISHING_BOBBER(102, ENTITY),

    LIVINGENTITY(-1, ENTITY),
    ARMOR_STAND(1, LIVINGENTITY),
    PLAYER(101, LIVINGENTITY),

    ABSTRACT_INSENTIENT(-1, LIVINGENTITY),
    ENDER_DRAGON(19, ABSTRACT_INSENTIENT),

    BEE(4, ABSTRACT_INSENTIENT),

    ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT),

    ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE),
    VILLAGER(85, ABSTRACT_AGEABLE),
    WANDERING_TRADER(89, ABSTRACT_AGEABLE),

    // Animals
    ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE),
    DOLPHIN(14, ABSTRACT_INSENTIENT),
    CHICKEN(9, ABSTRACT_ANIMAL),
    COW(11, ABSTRACT_ANIMAL),
    MOOSHROOM(50, COW),
    PANDA(53, ABSTRACT_INSENTIENT),
    PIG(55, ABSTRACT_ANIMAL),
    POLAR_BEAR(58, ABSTRACT_ANIMAL),
    RABBIT(60, ABSTRACT_ANIMAL),
    SHEEP(62, ABSTRACT_ANIMAL),
    TURTLE(78, ABSTRACT_ANIMAL),
    FOX(28, ABSTRACT_ANIMAL),

    ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL),
    CAT(7, ABSTRACT_TAMEABLE_ANIMAL),
    OCELOT(51, ABSTRACT_TAMEABLE_ANIMAL),
    WOLF(94, ABSTRACT_TAMEABLE_ANIMAL),

    ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL),
    PARROT(54, ABSTRACT_PARROT),

    // Horses
    ABSTRACT_HORSE(-1, ABSTRACT_ANIMAL),
    CHESTED_HORSE(-1, ABSTRACT_HORSE),
    DONKEY(13, CHESTED_HORSE),
    MULE(49, CHESTED_HORSE),
    LLAMA(39, CHESTED_HORSE),
    TRADER_LLAMA(76, CHESTED_HORSE),
    HORSE(32, ABSTRACT_HORSE),
    SKELETON_HORSE(67, ABSTRACT_HORSE),
    ZOMBIE_HORSE(96, ABSTRACT_HORSE),

    // Golem
    ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE),
    SNOW_GOLEM(70, ABSTRACT_GOLEM),
    IRON_GOLEM(86, ABSTRACT_GOLEM),
    SHULKER(63, ABSTRACT_GOLEM),

    // Fish
    ABSTRACT_FISHES(-1, ABSTRACT_CREATURE),
    COD(10, ABSTRACT_FISHES),
    PUFFERFISH(56, ABSTRACT_FISHES),
    SALMON(61, ABSTRACT_FISHES),
    TROPICAL_FISH(77, ABSTRACT_FISHES),

    // Monsters
    ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE),
    BLAZE(5, ABSTRACT_MONSTER),
    CREEPER(12, ABSTRACT_MONSTER),
    ENDERMITE(21, ABSTRACT_MONSTER),
    ENDERMAN(20, ABSTRACT_MONSTER),
    GIANT(30, ABSTRACT_MONSTER),
    SILVERFISH(65, ABSTRACT_MONSTER),
    VEX(84, ABSTRACT_MONSTER),
    WITCH(90, ABSTRACT_MONSTER),
    WITHER(91, ABSTRACT_MONSTER),
    RAVAGER(99, ABSTRACT_MONSTER),

    // Illagers
    ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER),
    ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE),
    EVOKER(23, ABSTRACT_EVO_ILLU_ILLAGER),
    ILLUSIONER(34, ABSTRACT_EVO_ILLU_ILLAGER),
    VINDICATOR(87, ABSTRACT_ILLAGER_BASE),
    PILLAGER(88, ABSTRACT_ILLAGER_BASE),

    // Skeletons
    ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER),
    SKELETON(66, ABSTRACT_SKELETON),
    STRAY(75, ABSTRACT_SKELETON),
    WITHER_SKELETON(92, ABSTRACT_SKELETON),

    // Guardians
    GUARDIAN(31, ABSTRACT_MONSTER),
    ELDER_GUARDIAN(17, GUARDIAN),

    // Spiders
    SPIDER(73, ABSTRACT_MONSTER),
    CAVE_SPIDER(8, SPIDER),

    // Zombies
    ZOMBIE(95, ABSTRACT_MONSTER),
    DROWNED(16, ZOMBIE),
    HUSK(33, ZOMBIE),
    ZOMBIE_PIGMAN(57, ZOMBIE),
    ZOMBIE_VILLAGER(97, ZOMBIE),

    // Flying entities
    ABSTRACT_FLYING(-1, ABSTRACT_INSENTIENT),
    GHAST(29, ABSTRACT_FLYING),
    PHANTOM(98, ABSTRACT_FLYING),

    ABSTRACT_AMBIENT(-1, ABSTRACT_INSENTIENT),
    BAT(3, ABSTRACT_AMBIENT),

    ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT),
    SQUID(74, ABSTRACT_WATERMOB),

    // Slimes
    SLIME(68, ABSTRACT_INSENTIENT),
    MAGMA_CUBE(41, SLIME),

    // Hangable objects
    ABSTRACT_HANGING(-1, ENTITY),
    LEASH_KNOT(38, ABSTRACT_HANGING),
    ITEM_FRAME(36, ABSTRACT_HANGING),
    PAINTING(52, ABSTRACT_HANGING),

    ABSTRACT_LIGHTNING(-1, ENTITY),
    LIGHTNING_BOLT(100, ABSTRACT_LIGHTNING),

    // Arrows
    ABSTRACT_ARROW(-1, ENTITY),
    ARROW(2, ABSTRACT_ARROW),
    SPECTRAL_ARROW(72, ABSTRACT_ARROW),
    TRIDENT(83, ABSTRACT_ARROW),

    // Fireballs
    ABSTRACT_FIREBALL(-1, ENTITY),
    DRAGON_FIREBALL(15, ABSTRACT_FIREBALL),
    FIREBALL(37, ABSTRACT_FIREBALL),
    SMALL_FIREBALL(69, ABSTRACT_FIREBALL),
    WITHER_SKULL(93, ABSTRACT_FIREBALL),

    // Projectiles
    PROJECTILE_ABSTRACT(-1, ENTITY),
    SNOWBALL(71, PROJECTILE_ABSTRACT),
    ENDER_PEARL(80, PROJECTILE_ABSTRACT),
    EGG(79, PROJECTILE_ABSTRACT),
    POTION(82, PROJECTILE_ABSTRACT),
    EXPERIENCE_BOTTLE(81, PROJECTILE_ABSTRACT),

    // Vehicles
    MINECART_ABSTRACT(-1, ENTITY),
    CHESTED_MINECART_ABSTRACT(-1, MINECART_ABSTRACT),
    CHEST_MINECART(43, CHESTED_MINECART_ABSTRACT),
    HOPPER_MINECART(46, CHESTED_MINECART_ABSTRACT),
    MINECART(42, MINECART_ABSTRACT),
    FURNACE_MINECART(45, MINECART_ABSTRACT),
    COMMAND_BLOCK_MINECART(44, MINECART_ABSTRACT),
    TNT_MINECART(48, MINECART_ABSTRACT),
    SPAWNER_MINECART(47, MINECART_ABSTRACT),
    BOAT(6, ENTITY);

    private static final EntityType[] TYPES;

    private final int id;
    private final EntityType parent;

    Entity1_15Types(int id) {
        this.id = id;
        this.parent = null;
    }

    Entity1_15Types(int id, EntityType parent) {
        this.id = id;
        this.parent = parent;
    }

    @Override
    public int getId() {
        return id;
    }

    @Override
    public EntityType getParent() {
        return parent;
    }

    static {
        TYPES = EntityTypeUtil.toOrderedArray(values());
    }

    public static EntityType getTypeFromId(int typeId) {
        return EntityTypeUtil.getTypeFromId(TYPES, typeId, ENTITY);
    }
}
