{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Network.Linode.Request where

import qualified Network.Linode.Response as Rsp (Filesystem, RunLevel, VirtMode)

import Data.Aeson
import qualified GHC.Generics (Generic)
import qualified Data.Maybe as M (Maybe)
import qualified Data.HashMap.Strict as H (HashMap)

data Linode = Linode { datacenter :: String,
                       service :: String,
                       source :: M.Maybe String,
                       root_pass :: M.Maybe String,
                       label :: M.Maybe String,
                       group :: M.Maybe String,
                       stackscript :: M.Maybe String,
                       stackscript_udf_responses :: M.Maybe (H.HashMap String String) } deriving (Eq, Show, GHC.Generics.Generic)

instance Data.Aeson.FromJSON Linode
instance Data.Aeson.ToJSON Linode

data Disk = Disk { size :: Int,
                   distribution :: M.Maybe String,
                   root_pass :: M.Maybe String,
                   root_ssh_key :: M.Maybe String,
                   label :: String,
                   filesystem :: Rsp.Filesystem,
                   read_only :: M.Maybe Bool,
                   stackscript :: M.Maybe String,
                   stackscript_udf_responses :: M.Maybe (H.HashMap String String) } deriving (Eq, Show, GHC.Generics.Generic)

instance Data.Aeson.FromJSON Disk
instance Data.Aeson.ToJSON Disk

data Config = Config { kernel :: String,
                       label :: String,
                       disks :: [String],
                       comments :: M.Maybe String,
                       ram_limit :: M.Maybe Int,
                       root_device_ro :: M.Maybe Bool,
                       devtmpfs_automount :: M.Maybe Bool,
                       run_level :: Rsp.RunLevel,
                       virt_mode :: Rsp.VirtMode } deriving (Eq, Show, GHC.Generics.Generic)

instance Data.Aeson.FromJSON Config
instance Data.Aeson.ToJSON Config