{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE OverloadedStrings #-}

module DigitalOcean.Region(
  Region(..),
  regions
                          ) where

import Control.Applicative ()
import Control.Monad (liftM, mzero)
import Control.Monad.IO.Class
import Data.Aeson ((.:), FromJSON(..), Value(..), decode)
import DigitalOcean.Base(Authentication, requestGet)

-- $setup
-- >>> import System.Environment
-- >>> import DigitalOcean.Base(Authentication(..))
-- >>> import Data.Maybe(isJust)

data Region = Region {
  regionName :: String,
  slug :: String,
  available :: Bool
} deriving (Show, Read)


-- | List all Regions
--
-- @
-- do
--     tkn <- getEnv "DIGITAL_OCEAN_PERSONAL_ACCESS_TOKEN"
--     maybeRegions <- regions $ Authentication tkn
--     print $ show $ isJust maybeRegions
-- @
--
regions :: Authentication -> (MonadIO m) => m (Maybe [Region])
regions a = liftM toList $ liftM decode (requestGet "regions" a)


newtype Regions = Regions [Region]

instance FromJSON Regions where
  parseJSON (Object v) = Regions <$> v.: "regions"
  parseJSON _          = mzero

instance FromJSON Region where
  parseJSON (Object v) =
    Region <$>
    (v .: "name") <*>
    (v .: "slug") <*>
    (v .: "available")
  parseJSON _ = mzero
    

toList :: Maybe Regions -> Maybe [Region]
toList = \rs ->  case rs of Just(Regions l) -> Just l
                            Nothing          -> Nothing