{-- TerraHS - Interface between TerraLib and Haskell

    (c) Sergio Costa (INPE) - Setembro, 2005

	This program is free software; you can redistribute it 
    and/or modify it under the terms of the GNU General 
    Public License 2.1 as published by the Free Software Foundation
    (http://www.opensource.org/licenses/gpl-license.php)
--}

{- | A module for supporting a TeQuerier TerraLib class

A class to build spatial temporal instances (STInstance) from different sources

More information - <http://www.terralib.org>
-}
module TerraHS.TerraLib.TeQuerier
	(
	
	-- * The @TeQuerier@ type
	TeQuerier(..), 
	
	-- * The @TeQueriers@ class
	TeQueriers(..)
	
	)
	where

import Foreign (Int32)
import Foreign.C.String
import qualified Foreign.Ptr (Ptr)

import TerraHS.Algebras.Base.Object
import TerraHS.Misc.GenericFunctions

import TerraHS.TerraLib.TeGeometry
import TerraHS.TerraLib.TeGeometryAlgorithms
import TerraHS.TerraLib.TeSTInstance
import TerraHS.TerraLib.TeLayer
import TerraHS.TerraLib.TeTheme


class TeQueriers q where
	-- | Loads the STInstances. If frame>-1, loads only the instances of the frame-ésimo frame 
	loadInstances :: (Foreign.Ptr.Ptr q) -> Prelude.IO Bool
	--  | Returns the number of instances to each time frame
	numElemInstances :: (Foreign.Ptr.Ptr q) -> Prelude.IO Int32 
	-- | Returns the next instances 
	nextInstance :: (Foreign.Ptr.Ptr q) -> Prelude.IO TeSTInstancePtr

	--getInstances :: (Foreign.Ptr.Ptr q) -> Int32 -> Int32 -> Prelude.IO [TeSTInstance]

-- | The type @TeQuerier @ represent a TerraLib Class  "TeQuerier"
data TeQuerier = TeQuerier TeLayerPtr Bool Bool  | TeQuerierTheme TeThemePtr Bool Bool    -- loadgeometries e loadatributes --- passa o ponteiro para haskell

-- | The type @TeQuerierPtr@ is a pointer to @TeQuerier@
type TeQuerierPtr = Foreign.Ptr.Ptr TeQuerier


instance TeQueriers TeQuerier where
	loadInstances ptr = tequerier_loadinstances ptr
	
	numElemInstances ptr = tequerier_numeleminstances ptr
	
	--getInstances q i size = (nextInstance q) >>= fromPointer >>= \geo -> 
	--	if i >= size then return [] else getInstances q (i+1) size >>= \xs -> return  (geo : xs)
		
	nextInstance ptr = (new TeSTInstance) >>= \st -> (tequerier_nextinstance ptr st) >> return st
	

instance Pointer TeQuerier where
	
	new (TeQuerier lptr loadgeo loadattr) = do
		qptr <- tequerier_new lptr loadgeo loadattr
		return qptr
	new (TeQuerierTheme lptr loadgeo loadattr) = do
		qptr <- tequerier_new2 lptr loadgeo loadattr
		return qptr
		
	delete l = error "not implemented"															       
	
----- funções "C" -------------
foreign import stdcall unsafe "c_tequerier_new" tequerier_new :: TeLayerPtr -> Bool -> Bool -> Prelude.IO TeQuerierPtr
foreign import stdcall unsafe "c_tequerier_new2" tequerier_new2 :: TeThemePtr -> Bool -> Bool -> Prelude.IO TeQuerierPtr
foreign import stdcall unsafe "c_tequerier_nextInstance" tequerier_nextinstance :: TeQuerierPtr -> TeSTInstancePtr -> Prelude.IO ()
foreign import stdcall unsafe "c_tequerier_loadInstances" tequerier_loadinstances :: TeQuerierPtr -> Prelude.IO Bool
foreign import stdcall unsafe "c_tequerier_numElemInstances" tequerier_numeleminstances :: TeQuerierPtr -> Prelude.IO Int32