{-# LANGUAGE TemplateHaskell #-}

module AWS.EC2.Types.Volume
    ( AttachmentSetItemResponse(..)
    , AttachmentSetItemResponseStatus(..)
    , CreateVolumeRequest(..)
    , Volume(..)
    , VolumeAttribute(..)
    , VolumeAttributeRequest(..)
    , VolumeState(..)
    , VolumeStatus(..)
    , VolumeStatusAction(..)
    , VolumeStatusDetail(..)
    , VolumeStatusEvent(..)
    , VolumeStatusInfo(..)
    , VolumeStatusInfoStatus(..)
    , VolumeType(..)
    ) where

import AWS.EC2.Types.Common (ProductCode, ResourceTag)
import AWS.Lib.FromText

data AttachmentSetItemResponse = AttachmentSetItemResponse
    { attachmentSetItemResponseVolumeId :: Text
    , attachmentSetItemResponseInstanceId :: Text
    , attachmentSetItemResponseDevice :: Text
    , attachmentSetItemResponseStatus
        :: AttachmentSetItemResponseStatus
    , attachmentSetItemResponseAttachTime :: UTCTime
    , attachmentSetItemResponseDeleteOnTermination :: Maybe Bool
    }
  deriving (Show, Read, Eq)

data AttachmentSetItemResponseStatus
    = AttachmentSetItemResponseStatusAttaching
    | AttachmentSetItemResponseStatusAttached
    | AttachmentSetItemResponseStatusDetaching
    | AttachmentSetItemResponseStatusDetached
  deriving (Show, Read, Eq)

data CreateVolumeRequest
    = CreateNewVolume
        { createNewVolumeSize :: Int
        , createNewVolumeAvailabilityZone :: Text
        , createNewVolumeVolumeType :: Maybe VolumeType
        }
    | CreateFromSnapshot
        { createFromSnapshotSnapshotId :: Text
        , createFromSnapshotAvailabilityZone :: Text
        , createFromSnapshotSize :: Maybe Int
        , createFromSnapshotVolumeType :: Maybe VolumeType
        }
  deriving (Show, Read, Eq)

data Volume = Volume
    { volumeId :: Text
    , volumeSize :: Int
    , volumeSnapshotId :: Maybe Text
    , volumeAvailabilityZone :: Text
    , volumeStatus :: VolumeState
    , volumeCreateTime :: UTCTime
    , volumeAttachmentSet :: [AttachmentSetItemResponse]
    , volumeTagSet :: [ResourceTag]
    , volumeVolumeType :: VolumeType
    }
  deriving (Show, Read, Eq)

data VolumeAttribute
    = VolumeAttributeAutoEnableIO Bool
    | VolumeAttributeProductCodes [ProductCode]
  deriving (Show, Read, Eq)

data VolumeAttributeRequest
    = VolumeAttributeRequestAutoEnableIO
    | VolumeAttributeRequestProductCodes
  deriving (Show, Read, Eq)

data VolumeState
    = VolumeStateCreating
    | VolumeStateAvailable
    | VolumeStateInUse
    | VolumeStateDeleting
    | VolumeStateDeleted
    | VolumeStateError
  deriving (Show, Read, Eq)

data VolumeStatus = VolumeStatus
    { volumeStatusVolumeId :: Text
    , volumeStatusAvailabilityZone :: Text
    , volumeStatusVolumeStatus :: VolumeStatusInfo
    , volumeStatusEventSet :: [VolumeStatusEvent]
    , volumeStatusActionSet :: [VolumeStatusAction]
    }
  deriving (Show, Read, Eq)

data VolumeStatusAction = VolumeStatusAction
    { volumeStatusActionCode :: Text
    , volumeStatusActionEventType :: Text
    , volumeStatusActionEventId :: Text
    , volumeStatusActionDescription :: Text
    }
  deriving (Show, Read, Eq)

data VolumeStatusDetail = VolumeStatusDetail
    { volumeStatusDetailName :: Text
    , volumeStatusDetailStatus :: Text
    }
  deriving (Show, Read, Eq)

data VolumeStatusEvent = VolumeStatusEvent
    { volumeStatusEventType :: Text
    , volumeStatusEventId :: Text
    , volumeStatusEventDescription :: Text
    , volumeStatusEventNotBefore :: Maybe UTCTime
    , volumeStatusEventNotAfter :: Maybe UTCTime
    }
  deriving (Show, Read, Eq)

data VolumeStatusInfo = VolumeStatusInfo
    { volumeStatusInfoStatus :: VolumeStatusInfoStatus
    , volumeStatusInfoDetails :: [VolumeStatusDetail]
    }
  deriving (Show, Read, Eq)

data VolumeStatusInfoStatus
    = VolumeStatusInfoStatusOK
    | VolumeStatusInfoStatusImpaired
    | VolumeStatusInfoStatusInsufficientData
  deriving (Show, Read, Eq)

data VolumeType
    = VolumeTypeStandard
    | VolumeTypeIO1 Int
  deriving (Show, Read, Eq)

deriveFromText "AttachmentSetItemResponseStatus"
    ["attaching", "attached", "detaching", "detached"]
deriveFromText "VolumeState"
    [ "creating"
    , "available"
    , "in-use"
    , "deleting"
    , "deleted"
    , "error"
    ]
deriveFromText "VolumeStatusInfoStatus"
    ["ok", "impaired", "insufficient-data"]