// Path: src/main/java/com/endercrest/voidspawn/modes/Mode.java
// public interface Mode extends OptionContainer {
// 
//     /**
//      * Called when the player enters the void.
//      *
//      * @param player    The player who has entered the void and be teleported or whatever the action is.
//      * @param worldName The world name in which the player resides.
//      * @return Returns whether the action successfully occurred.
//      */
//     TeleportResult onActivate(Player player, String worldName);
// 
//     /**
//      * This method is called when this mode is set in a world. This is meant to give any additional instructions should a mode require it.
//      * As well as change any settings if necessary.
//      *
//      * @param args      The args from the command on the set.
//      * @param worldName The world name where the mode was set.
//      * @param p         The player who invoked the command to set the mode.
//      * @return Returns whether the onSet method successfully executed and gave proper details.
//      */
//     default boolean onSet(String[] args, String worldName, Player p) {
//         ConfigManager.getInstance().setMode(worldName, args[1]);
//         return true;
//     }
// 
//     /**
//      * The statuses of the current mode. Used for providing information on whether this mode is configured correctly or
//      * providing any other information to the user.
//      *
//      * @param worldName The name of world to get the status of.
//      * @return Must always return a non-null array.
//      */
//     Status[] getStatus(String worldName);
// 
//     boolean isEnabled();
// 
//     /**
//      * Get the details about the mode. This should be an unformatted string.
//      * ex. "Will teleport player to set spot."
//      *
//      * @return Returns the string that will be displayed upon player request details of the mode.
//      */
//     String getDescription();
// 
//     /**
//      * Get the name of the mode.
//      *
//      * @return The string version of the mode.
//      */
//     String getName();
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/Option.java
// public interface Option<T> {
//     /**
//      * Get the option identifer for this object.
//      */
//     @NotNull
//     OptionIdentifier<T> getIdentifier();
// 
//     /**
//      * Get the type that this option contains.
//      */
//     @NotNull
//     Class<T> getType();
// 
//     /**
//      * Get the value of the option for the given world.
//      * @param world The value to retrieve the value for
//      * @return Empty if value is not set.
//      */
//     Optional<T> getValue(World world);
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param value String value will be contained with the the {@link #getOptions()}
//      */
//     void setValue(@NotNull World world, String value) throws IllegalArgumentException;
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param args The arguments
//      */
//     void setValue(@NotNull World world, String[] args) throws IllegalArgumentException;
// 
//     /**
//      * Specifies all the values that are acceptable as a value.
//      * @return A non-null set of accepted values or null if any value is accepted.
//      */
//     List<String> getOptions();
// 
//     /**
//      * Get description of the option.
//      */
//     String getDescription();
// 
//     /**
//      * Get the status of this option. This is useful to get a state of the option
//      * @param world The world
//      * @return
//      */
//     @NotNull
//     Status getStatus(World world);
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/OptionIdentifier.java
// public class OptionIdentifier<T> {
//     private final Class<T> type;
//     private final String name;
//     private final String description;
// 
//     public OptionIdentifier(Class<T> type, String name, String description) {
//         this.type = type;
//         this.name = name;
//         this.description = description;
//     }
// 
//     public Class<T> getType() {
//         return type;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/container/OptionContainer.java
// public interface OptionContainer {
//     /**
//      * Attempt to retrieve a option of the given name.
//      *
//      * @param <T>        The type the option will be casted to.
//      * @param identifier The identifier for the option.
//      * @return The option if it exists, returns empty if no existing option or
//      * if the option identifier type does not match option type.
//      */
//     @NotNull <T> Option<T> getOption(OptionIdentifier<T> identifier);
// 
//     /**
//      * Attempt to retrieve a option of the given name by the name. If possible, use {@link #getOption(OptionIdentifier)} as
//      * that guarantees a type.
//      *
//      * @param name The name of the option to retrieve.
//      * @return The option or null if doesn't exist.
//      */
//     @Nullable Option<?> getOption(String name);
// 
//     /**
//      * Get a list of all options for this mode.
//      *
//      * @return non-null list of options
//      */
//     Collection<Option<?>> getOptions();
// }


import com.endercrest.voidspawn.modes.Mode;
import com.endercrest.voidspawn.options.Option;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.options.container.OptionContainer;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
package com.endercrest.voidspawn.detectors;



public interface Detector extends OptionContainer {

    /**
     * Checks if the current player is within the 'detected' region. This is used to signal to the mode whether it
     * should activate
     * @param mode The current mode
     * @param player The player
     * @param world The world
     */
    boolean isDetected(Mode mode, Player player, World world);

// Path: src/main/java/com/endercrest/voidspawn/modes/Mode.java
// public interface Mode extends OptionContainer {
// 
//     /**
//      * Called when the player enters the void.
//      *
//      * @param player    The player who has entered the void and be teleported or whatever the action is.
//      * @param worldName The world name in which the player resides.
//      * @return Returns whether the action successfully occurred.
//      */
//     TeleportResult onActivate(Player player, String worldName);
// 
//     /**
//      * This method is called when this mode is set in a world. This is meant to give any additional instructions should a mode require it.
//      * As well as change any settings if necessary.
//      *
//      * @param args      The args from the command on the set.
//      * @param worldName The world name where the mode was set.
//      * @param p         The player who invoked the command to set the mode.
//      * @return Returns whether the onSet method successfully executed and gave proper details.
//      */
//     default boolean onSet(String[] args, String worldName, Player p) {
//         ConfigManager.getInstance().setMode(worldName, args[1]);
//         return true;
//     }
// 
//     /**
//      * The statuses of the current mode. Used for providing information on whether this mode is configured correctly or
//      * providing any other information to the user.
//      *
//      * @param worldName The name of world to get the status of.
//      * @return Must always return a non-null array.
//      */
//     Status[] getStatus(String worldName);
// 
//     boolean isEnabled();
// 
//     /**
//      * Get the details about the mode. This should be an unformatted string.
//      * ex. "Will teleport player to set spot."
//      *
//      * @return Returns the string that will be displayed upon player request details of the mode.
//      */
//     String getDescription();
// 
//     /**
//      * Get the name of the mode.
//      *
//      * @return The string version of the mode.
//      */
//     String getName();
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/Option.java
// public interface Option<T> {
//     /**
//      * Get the option identifer for this object.
//      */
//     @NotNull
//     OptionIdentifier<T> getIdentifier();
// 
//     /**
//      * Get the type that this option contains.
//      */
//     @NotNull
//     Class<T> getType();
// 
//     /**
//      * Get the value of the option for the given world.
//      * @param world The value to retrieve the value for
//      * @return Empty if value is not set.
//      */
//     Optional<T> getValue(World world);
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param value String value will be contained with the the {@link #getOptions()}
//      */
//     void setValue(@NotNull World world, String value) throws IllegalArgumentException;
// 
//     /**
//      * Set the value of this option
//      * @param world The world the value is being set for.
//      * @param args The arguments
//      */
//     void setValue(@NotNull World world, String[] args) throws IllegalArgumentException;
// 
//     /**
//      * Specifies all the values that are acceptable as a value.
//      * @return A non-null set of accepted values or null if any value is accepted.
//      */
//     List<String> getOptions();
// 
//     /**
//      * Get description of the option.
//      */
//     String getDescription();
// 
//     /**
//      * Get the status of this option. This is useful to get a state of the option
//      * @param world The world
//      * @return
//      */
//     @NotNull
//     Status getStatus(World world);
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/OptionIdentifier.java
// public class OptionIdentifier<T> {
//     private final Class<T> type;
//     private final String name;
//     private final String description;
// 
//     public OptionIdentifier(Class<T> type, String name, String description) {
//         this.type = type;
//         this.name = name;
//         this.description = description;
//     }
// 
//     public Class<T> getType() {
//         return type;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// }
// 
// Path: src/main/java/com/endercrest/voidspawn/options/container/OptionContainer.java
// public interface OptionContainer {
//     /**
//      * Attempt to retrieve a option of the given name.
//      *
//      * @param <T>        The type the option will be casted to.
//      * @param identifier The identifier for the option.
//      * @return The option if it exists, returns empty if no existing option or
//      * if the option identifier type does not match option type.
//      */
//     @NotNull <T> Option<T> getOption(OptionIdentifier<T> identifier);
// 
//     /**
//      * Attempt to retrieve a option of the given name by the name. If possible, use {@link #getOption(OptionIdentifier)} as
//      * that guarantees a type.
//      *
//      * @param name The name of the option to retrieve.
//      * @return The option or null if doesn't exist.
//      */
//     @Nullable Option<?> getOption(String name);
// 
//     /**
//      * Get a list of all options for this mode.
//      *
//      * @return non-null list of options
//      */
//     Collection<Option<?>> getOptions();
// }


// Path: src/main/java/com/endercrest/voidspawn/detectors/Detector.java
import com.endercrest.voidspawn.modes.Mode;
import com.endercrest.voidspawn.options.Option;
import com.endercrest.voidspawn.options.OptionIdentifier;
import com.endercrest.voidspawn.options.container.OptionContainer;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;

package com.endercrest.voidspawn.detectors;



public interface Detector extends OptionContainer {

    /**
     * Checks if the current player is within the 'detected' region. This is used to signal to the mode whether it
     * should activate
     * @param mode The current mode
     * @param player The player
     * @param world The world
     */
    boolean isDetected(Mode mode, Player player, World world);

    String getDescription();