/*
 * Copyright (C) 2006 Steve Ratcliffe
 * 
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 * 
 *  This program 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.
 * 
 * 
 * Author: Steve Ratcliffe
 * Create date: 16-Dec-2006
 */
package uk.me.parabola.mkgmap.general;

import java.io.FileNotFoundException;

import uk.me.parabola.imgfmt.FormatException;
import uk.me.parabola.util.Configurable;

/**
 * A source of map information in a standard format.  The OSM reader presents
 * this interface to the main map making program.  OSM concepts are converted
 * into Garmin map based structures such as {@link MapLine}. 
 *
 * Note that it does not reference anything from the imgfmt package that
 * relies on subdivisions.  In other words it does not directly reference
 * Point or Polyline as they depend on the subdivision they are in.  It
 * can refer to Coord and Overview however as they have global meaning.
 *
 * @author Steve Ratcliffe
 */
public interface LoadableMapDataSource extends MapDataSource, Configurable {

	/**
	 * Determines if the file (or other resource) is supported by this map
	 * data source.  The implementation may do this however it likes, eg
	 * by extension or by opening up the file and reading part of it.
	 *
	 * @param name The file (or other resource) to check.
	 * @return True if the loadable map data source supports that file.
	 */
	public boolean isFileSupported(String name);

	/**
	 * Load map by name.  The name is in a suitable form to be recognised
	 * by the particular map source.  It could be a file name or a URI.
	 *
	 * You would implement this interface to read mapping data in an other
	 * format.
	 *
	 * @param name The name of the resource to be loaded.
	 * @param addBackground set to true if 0x4b polygon is wanted
	 * @throws FileNotFoundException When the file or resource is not found.
	 * @throws FormatException For any kind of malformed input.
	 */
	public void load(String name, boolean addBackground)
			throws FileNotFoundException, FormatException;

	/**
	 * Get the map levels for this map.  This is an array of @{link LevelInfo}
	 * structures that map a level to a resolution.  Some map data sources
	 * may actually have the concept of map layers that can be used to
	 * construct this information.  Others may just have to provide a default
	 * that is useful with the map source.  In the latter case it would be
	 * important to be able to configure the levels separately while creating
	 * the map.
	 *
	 * <p>Note that it does not include the top empty level as we will always
	 * generate that in the main program automatically.
	 *
	 * @return Array of structures that map the level to the resolution.  Never
	 * returns null. Some kind of default should always be returned and this
	 * must include at least one level.
	 */
	public LevelInfo[] mapLevels();
	
	/**
	 * Levels for the overview map.
	 * @return Array of structures that map the level to the resolution or null
	 * if not defined in options.
	 */
	public LevelInfo[] overviewMapLevels();

	/**
	 * Get a suitable copyright message for this map source.  You can get
	 * this information from the input file, if the file has such information
	 * or as in the case of OSM the data has a well known copyright, so we
	 * can return fixed strings referring to it.
	 *
	 * @return An array of strings with copyright information.  If there are
	 * none then return a zero length array.
	 */
	public String[] copyrightMessages();

}
