{-# LANGUAGE TypeFamilies #-}

module Data.Xournal.Map where

import Data.IntMap 
import Data.Xournal.Simple
import Data.Xournal.Generic
import Data.Xournal.BBox

type TPageMap = GPage Background IntMap TLayerSimple 

type TXournalMap = GXournal [] TPageMap 

type TPageBBoxMap = GPage Background IntMap TLayerBBox

type TXournalBBoxMap = GXournal IntMap TPageBBoxMap

type TPageBBoxMapBkg b = GPage b IntMap TLayerBBox

type TXournalBBoxMapBkg b = GXournal IntMap (TPageBBoxMapBkg b)


{-
data XournalBBoxMap = XournalBBoxMap { xbm_pages :: M.IntMap PageBBoxMap } 

data PageBBoxMap = PageBBoxMap { pbm_dim :: Dimension
                               , pbm_bkg :: Background
                               , pbm_layers :: M.IntMap LayerBBox }
-}

{-
instance IPage PageBBoxMap where
  type TLayer PageBBoxMap = LayerBBox
  pageDim = pbm_dim 
  pageBkg = pbm_bkg
  pageLayers = M.elems . pbm_layers
  
instance IXournal XournalBBoxMap where
  type TPage XournalBBoxMap = PageBBoxMap 
  xournalPages = M.elems . xbm_pages 
  
mkXournalBBoxMapFromXournalBBox :: XournalBBox -> XournalBBoxMap 
mkXournalBBoxMapFromXournalBBox xoj = 
  XournalBBoxMap { xbm_pages = M.map mkPageBBoxMapFromPageBBox 
                             . M.fromList 
                             $ zip [0..] (xojbbox_pages xoj) }  

mkPageBBoxMapFromPageBBox :: PageBBox -> PageBBoxMap
mkPageBBoxMapFromPageBBox page = 
  PageBBoxMap { pbm_dim = pagebbox_dim page
              , pbm_bkg = pagebbox_bkg page
              , pbm_layers = M.fromList $ zip [0..] (pagebbox_layers page) }

mkXournalBBoxMapFromXournal :: Xournal -> XournalBBoxMap 
mkXournalBBoxMapFromXournal = mkXournalBBoxMapFromXournalBBox . mkXournalBBoxFromXournal 

xournalFromXournalBBoxMap :: XournalBBoxMap -> Xournal 
xournalFromXournalBBoxMap xoj = 
  emptyXournal { xoj_pages = map pageFromPageBBoxMap (xournalPages xoj) } 
  
pageFromPageBBoxMap :: PageBBoxMap -> Page 
pageFromPageBBoxMap page = 
  let pbox  = PageBBox { pagebbox_dim = pbm_dim page
                       , pagebbox_bkg = pbm_bkg page
                       , pagebbox_layers = pageLayers page }
  in pageFromPageBBox pbox 
 
-}