// License: GPL. For details, see Readme.txt file.
package org.openstreetmap.gui.jmapviewer.tilesources;

import java.util.Map;
import java.util.Set;

/**
 * Data class that keeps basic information about a tile source.
 *
 * @since 31122
 */
public class TileSourceInfo {
    /** id for this imagery entry, optional at the moment */
    protected String id;

    /** URL of the imagery service */
    protected String url;

    /** name of the imagery layer */
    protected String name;

    /** headers meaning, that there is no tile at this zoom level */
    protected Map<String, Set<String>> noTileHeaders;

    /** checksum of empty tiles */
    protected Map<String, Set<String>> noTileChecksums;

    /** minimum zoom level supported by the tile source */
    protected int minZoom;

    /** maximum zoom level supported by the tile source */
    protected int maxZoom;

    /** cookies that needs to be sent to tile source */
    protected String cookies = "";

    /** tile size of the displayed tiles */
    protected int tileSize = -1;

    /** mapping &lt;header key, metadata key&gt; */
    protected Map<String, String> metadataHeaders;

    /** supports "/status" and "/dirty" mode (tile re-rendering) */
    protected boolean modTileFeatures;

    /**
     * Create a TileSourceInfo class
     *
     * @param name name
     * @param baseUrl base URL
     * @param id unique id
     */
    public TileSourceInfo(String name, String baseUrl, String id) {
        this.name = name;
        this.url = baseUrl;
        this.id = id;
    }

    /**
     * Create a TileSourceInfo class
     *
     * @param name name
     */
    public TileSourceInfo(String name) {
        this(name, null, null);
    }

    /**
     * Creates empty TileSourceInfo class
     */
    public TileSourceInfo() {
        this(null, null, null);
    }

    /**
     * Request name of the tile source
     * @return name of the tile source
     */
    public final String getName() {
        return name;
    }

    /**
     * Request URL of the tile source
     * @return url of the tile source
     */
    public final String getUrl() {
        return url;
    }

    /**
     * Request ID of the tile source. Id can be null. This gets the configured id as is.
     * Due to a user error, this may not be unique.
     * @return id of the tile source
     */
    public final String getId() {
        return id;
    }

    /**
     * Request header information for empty tiles for servers delivering such tile types
     * @return map of headers, that when set, means that this is "no tile at this zoom level" situation
     * @since 32022
     */
    public Map<String, Set<String>> getNoTileHeaders() {
        return noTileHeaders;
    }

    /**
     * Checksum for empty tiles for servers delivering such tile types
     * @return map of checksums, that when detected, means that this is "no tile at this zoom level" situation
     * @since 32022
     */
    public Map<String, Set<String>> getNoTileChecksums() {
        return noTileChecksums;
    }

    /**
     * Request supported minimum zoom level
     * @return minimum zoom level supported by tile source
     */
    public int getMinZoom() {
        return minZoom;
    }

    /**
     * Request supported maximum zoom level
     * @return maximum zoom level supported by tile source
     */
    public int getMaxZoom() {
        return maxZoom;
    }

    /**
     * Request cookies to be sent together with request
     * @return cookies to be sent along with request to tile source
     */
    public String getCookies() {
        return cookies;
    }

    /**
     * Request tile size of this tile source
     * @return tile size provided by this tile source, or -1 when default value should be used
     */
    public int getTileSize() {
        return tileSize;
    }

    /**
     * Request metadata headers
     * @return mapping &lt;HTTP header name, Metadata key name&gt; for copying HTTP headers to Tile metadata
     * @since 31125
     */
    public Map<String, String> getMetadataHeaders() {
        return metadataHeaders;
    }

    /**
     * Sets the tile size provided by this tile source
     * @param tileSize tile size in pixels
     */
    public final void setTileSize(int tileSize) {
        if (tileSize == 0 || tileSize < -1) {
            throw new AssertionError("Invalid tile size: " + tileSize);
        }
        this.tileSize = tileSize;
    }

    /**
     * Sets the tile URL.
     * @param url tile URL
     */
    public final void setUrl(String url) {
        this.url = url;
    }

    /**
     * Sets the tile name.
     * @param name tile name
     */
    public final void setName(String name) {
        this.name = name;
    }

    /**
     * Sets the tile id.
     * @param id tile id
     */
    public final void setId(String id) {
        this.id = id;
    }

    /**
     * Sets the cookies to be sent together with request
     * @param cookies cookies to be sent along with request to tile source
     */
    public final void setCookies(String cookies) {
        this.cookies = cookies;
    }

    /**
     * Determines if this imagery supports "/status" and "/dirty" mode (tile re-rendering).
     * @return <code>true</code> if it supports "/status" and "/dirty" mode (tile re-rendering)
     */
    public final boolean isModTileFeatures() {
        return modTileFeatures;
    }

    /**
     * Sets whether this imagery supports "/status" and "/dirty" mode (tile re-rendering).
     * @param modTileFeatures <code>true</code> if it supports "/status" and "/dirty" mode (tile re-rendering)
     */
    public final void setModTileFeatures(boolean modTileFeatures) {
        this.modTileFeatures = modTileFeatures;
    }
}
