/*
 * This file is part of HoloAPI.
 *
 * HoloAPI is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HoloAPI is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HoloAPI.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.dsh105.holoapi.image;

import org.bukkit.command.CommandSender;

/**
 * Represents an image loader used to store pre-loaded images and animations from the HoloAPI Configuration file
 *
 * @param <T> type of generator
 */

public interface ImageLoader<T extends Generator> {

    /**
     * Gets a loaded generator. If the generator found has a URL type and has not yet been loaded, the loading process
     * will be started and the method will return null
     * <p>
     * Also sends a message to the {@link org.bukkit.command.CommandSender} if the URL image is being loaded
     *
     * @param sender sender to send the URL loading message to
     * @param key    key to search for a generator with
     * @return Image or Animation loader loaded with HoloAPI. Returns null if the image generator is not found or a URL
     * generator is being loaded
     */
    public T getGenerator(CommandSender sender, String key);

    /**
     * Gets a loaded generator. If the generator found has a URL type and has not yet been loaded, the loading process
     * will be started and the method will return null
     *
     * @param key key to search for a generator with
     * @return Image or Animation loader loaded with HoloAPI. Returns null if the image generator is not found or a URL
     * generator is being loaded
     */
    public T getGenerator(String key);

    /**
     * Checks and returns whether a generator of a key exists. This does NOT check for unloaded URL generators
     *
     * @param key key to search for a generator with
     * @return true if the generator exists
     */
    public boolean exists(String key);

    /**
     * Checks and returns whether an unloaded URL generator of a key exists. This ONLY checks for UNLOADED URL
     * generators
     *
     * @param key key to search for a generator with
     * @return true if the unloaded URL generator exists
     */
    public boolean existsAsUnloadedUrl(String key);

    /**
     * Gets whether this loader has finished loading all generators
     *
     * @return true if finished loading
     */
    public boolean isLoaded();

    /**
     * Represents the type of image being loaded
     */
    public enum ImageLoadType {
        /**
         * Represents a URL image that is retrieved from a HTTP address
         */
        URL,

        /**
         * Represents an image that can be located within the HoloAPI plugin data folder
         */
        FILE
    }
}