{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}

module Network.DigitalOcean.Services.FloatingIp where

-----------------------------------------------------------------
import        Data.Aeson
import        Data.Aeson.Casing
import        Data.Time.Clock
import        GHC.Generics
-----------------------------------------------------------------
import        Network.DigitalOcean.Types
import        Network.DigitalOcean.Utils.Pagination
import        Network.DigitalOcean.Utils.Actions
import        Network.DigitalOcean.Services.Region
import        Network.DigitalOcean.Services.Droplet
-----------------------------------------------------------------

data FloatingIp = FloatingIp
  { floatingipIp      :: IpAddress
  , floatingipRegion  :: Region
  , floatingipDroplet :: Droplet
  } deriving (Show, Generic)

instance FromJSON (Response FloatingIp) where
  parseJSON (Object v) =
    fmap Response $ parseJSON =<< (v .: "floating_ip")

instance FromJSON (Response [FloatingIp]) where
  parseJSON (Object v) =
    fmap Response $ parseJSON =<< (v .: "floating_ips")

instance FromJSON FloatingIp where
  parseJSON = genericParseJSON $ aesonPrefix snakeCase

instance FromJSON (PaginationState FloatingIp) where
  parseJSON (Object v) = parsePaginationState v "floating_ips"

instance Paginatable FloatingIp

data FloatingIpPayload =
    FloatingIpRegionPayload RegionSlug
  | FloatingIpDropletPayload DropletId
  deriving Show

instance ToJSON FloatingIpPayload where
  toJSON (FloatingIpRegionPayload regionSlug) = object [ "region" .= regionSlug ]
  toJSON (FloatingIpDropletPayload dropletId) = object [ "droplet_id" .= dropletId ]

instance Payload FloatingIpPayload

data FloatingIpAction =
    AssignToDroplet DropletId
  | Unassign
  deriving Show

instance ToJSON FloatingIpAction where
  toJSON (AssignToDroplet dropletId) = object [ actionType' "assign", "droplet_id" .= dropletId ]
  toJSON Unassign = object [ actionType' "unassign" ]

instance Payload FloatingIpAction