{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Data.Geometry.Geos.Serialize (
    readHex
  , readLotsOfHex
  , writeHex
  , readWkt
  , writeWkt
) where

import Data.Geometry.Geos.Raw.Base
import Data.Geometry.Geos.Geometry
import qualified Data.Geometry.Geos.Raw.Serialize as S
import qualified Data.Geometry.Geos.Raw.Geometry as R
import Data.Geometry.Geos.Types
import qualified Data.ByteString.Char8 as BC
import Data.Maybe (catMaybes)

readHex :: BC.ByteString -> Maybe (Some Geometry)
readHex bs = runGeos $ do
  r <- S.createReader
  g <- S.readHex r bs
  case g of
    Just g' -> Just <$> convertGeometryFromRaw g'
    Nothing -> return Nothing

readLotsOfHex :: [BC.ByteString] -> [Some Geometry]
readLotsOfHex bs = runGeos $ do
  r <- S.createReader
  x <- traverse (S.readHex r) bs
  traverse convertGeometryFromRaw $ catMaybes x

writeHex :: Geometry a -> BC.ByteString
writeHex g = runGeos $ do
  w <- S.createWriter
  r :: R.Geom <- convertGeometryToRaw g
  S.writeHex w r

readWkt :: Maybe Int -> BC.ByteString -> Maybe (Some Geometry)
readWkt srid bs = runGeos $ do
  r <- S.createWktReader
  g <- S.readWkt r bs
  case g of
    Just g' -> do
      g'' <- R.setSRID srid g'
      Just <$> convertGeometryFromRaw g''
    Nothing -> return Nothing

writeWkt :: Geometry a -> BC.ByteString
writeWkt g = runGeos $ do
  w <- S.createWktWriter
  r :: R.Geom <- convertGeometryToRaw g
  S.writeWkt w r