-- LegacyWorlds Beta 6
-- PostgreSQL database scripts
--
-- Map display functions and related types
--
-- Copyright(C) 2004-2010, DeepClone Development
-- --------------------------------------------------------


-- Map entry
CREATE TYPE map_entry_type AS (
	x			INT ,
	y			INT ,
	orbit		INT ,
	id			INT ,
	picture		INT ,
	name		TEXT ,
	tag			TEXT ,
	display		empire_relation_type
);


--
-- Generates the map from an empire's point of view
--
-- Parameters:
--	e_id	the empire viewing the map
--	min_x	minimal X coordinate
--	min_y	minimal Y coordinate
--	max_x	maximal X coordinate
--	max_y	maximal Y coordinate
--
-- Returns:
--	a set of map entries
--

CREATE OR REPLACE FUNCTION verse.get_map( e_id INT , min_x INT , min_y INT , max_x INT , max_y INT )
	RETURNS SETOF map_entry_type
	STRICT STABLE
	SECURITY DEFINER
AS $$
	SELECT mv.x AS x , mv.y AS y , mv.orbit AS orbit , mv.id AS id , mv.picture AS picture ,
			mv.name AS name , mv.tag AS tag ,
			(CASE
				WHEN mv.owner = $1 THEN 'OWN'
				WHEN mv.alliance_id IS NOT NULL AND mv.alliance_id = ea.alliance_id THEN 'ALLIED'
				WHEN en.alliance_id IS NOT NULL THEN 'ENEMY'
				ELSE NULL
			END )::empire_relation_type AS display
		FROM verse.map_view mv
			LEFT OUTER JOIN emp.alliance_members ea
				ON ea.empire_id = $1 AND NOT is_pending
			LEFT OUTER JOIN emp.enemy_alliances en
				ON en.empire_id = $1 AND en.alliance_id = mv.alliance_id
		WHERE x BETWEEN $2 AND $4 AND y BETWEEN $3 AND $5;
$$ LANGUAGE SQL;

GRANT EXECUTE ON FUNCTION verse.get_map( INT , INT , INT , INT , INT ) TO :dbuser;