package ch.epfl.isochrone.tiledmap;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;

/**
 * Classe servant un fournisseur de tuile OSM
 * 
 * @author Charles Thiebaut (238935)
 * @author Arnaud Delamare (234841)
 * 
 */
public class OSMTileProvider implements TileProvider {
    private String base;
    private Tile errorTile;

    /**
     * 
     * @param adresseBase
     *            L'adresse de base du serveur
     * @throws IOException
     *             Si le programme n'arrive pas à ouvrir la tile d'erreur
     */
    public OSMTileProvider(String adresseBase) throws IOException {
        this.base = adresseBase;
        this.errorTile = new Tile(0, 0, 0, ImageIO.read(getClass().getResource(
                "/images/error-tile.png")));
    }

    /**
     * 
     * Constructeur avec en paramètre une URL à la place d'un string
     */
    public OSMTileProvider(URL adresseBase) throws IOException {
        this(adresseBase.toString());
    }

    /**
     * 
     * Retourne la tile correspondante ou la tile d'erreur si la bonne tile n'a
     * pas pu être chargée
     * 
     * @param zoom
     *            Le zoom de la Tile
     * 
     * @param x
     *            La position x de la Tile
     * 
     * @param y
     *            La position y de la Tile
     */
    @Override
    public Tile tileAt(int zoom, int x, int y) {
        try {
            URL adresse = new URL(base + "/" + zoom + "/" + x + "/" + y
                    + ".png");
            BufferedImage image = ImageIO.read(adresse);

            return new Tile(x, y, zoom, image);

        } catch (MalformedURLException e) {
            return errorTile;
        } catch (IOException e) {
            return errorTile;
        }

    }

}
