package li.cil.oc.api.event;

import li.cil.oc.api.machine.Robot;
import net.minecraft.world.World;
import net.minecraftforge.event.Cancelable;

public abstract class RobotBreakBlockEvent extends RobotEvent {
    protected RobotBreakBlockEvent(Robot robot) {
        super(robot);
    }

    /**
     * Fired when a robot is about to break a block.
     * <p/>
     * Canceling this event will prevent the block from getting broken.
     */
    @Cancelable
    public static class Pre extends RobotBreakBlockEvent {
        /**
         * The world in which the block will be broken.
         */
        public final World world;

        /**
         * The coordinates at which the block will be broken.
         */
        public final int x, y, z;

        /**
         * The time it takes to break the block.
         */
        private double breakTime;

        public Pre(Robot robot, World world, int x, int y, int z, double breakTime) {
            super(robot);
            this.world = world;
            this.x = x;
            this.y = y;
            this.z = z;
            this.breakTime = breakTime;
        }

        /**
         * Sets the time it should take the robot to break the block.
         * <p/>
         * Note that the robot will still break the block instantly, but the
         * robot's execution is paused for the specified amount of time.
         *
         * @param breakTime the time in seconds the break operation takes.
         */
        public void setBreakTime(double breakTime) {
            this.breakTime = Math.max(0.05, breakTime);
        }

        /**
         * Gets the time that it will take to break the block.
         *
         * @see #setBreakTime(double)
         */
        public double getBreakTime() {
            return breakTime;
        }
    }

    /**
     * Fired after a robot broke a block.
     */
    public static class Post extends RobotBreakBlockEvent {
        /**
         * The amount of experience the block that was broken generated (e.g. certain ores).
         */
        public final double experience;

        public Post(Robot robot, double experience) {
            super(robot);
            this.experience = experience;
        }
    }
}
