package tc.oc.pgm.destroyable;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import org.bukkit.block.Block;
import org.bukkit.block.BlockState;

import com.google.common.base.Preconditions;
import tc.oc.pgm.match.ParticipantState;

/**
 * Provides additional information about why a {@link Destroyable} was damaged.
 */
public class DestroyableHealthChange {
    private final @Nonnull BlockState oldState;
    private final @Nonnull BlockState newState;
    private final @Nullable ParticipantState playerCause;
    private final int healthChange;

    /**
     * Creates an instance of the class.
     *
     * @param oldState State the destroyed block was in before broken
     * @param playerCause Player most responsible for the damage
     */
    public DestroyableHealthChange(@Nonnull BlockState oldState,
                                   @Nonnull BlockState newState,
                                   @Nullable ParticipantState playerCause,
                                   int healthChange) {
        Preconditions.checkNotNull(oldState, "old block state");

        this.oldState = oldState;
        this.newState = newState;
        this.playerCause = playerCause;
        this.healthChange = healthChange;
    }

    /**
     * Gets the block that was damaged.
     *
     * @return Damaged block
     */
    public @Nonnull Block getBlock() {
        return this.oldState.getBlock();
    }

    /**
     * Gets the state of the block before being damaged.
     *
     * @return Old block state
     */
    public @Nonnull BlockState getOldState() {
        return this.oldState;
    }

    /**
     * Gets the state of the block after being damaged.
     *
     * @return Old block state
     */
    public @Nonnull BlockState getNewState() {
        return this.newState;
    }

    /**
     * Gets the player responsible for the damage.
     *
     * @return Player responsible for the damage or null if none exists
     */
    public @Nullable ParticipantState getPlayerCause() {
        return this.playerCause;
    }

    public int getHealthChange() {
        return healthChange;
    }
}