{-# LANGUAGE TemplateHaskell #-}

module AWS.EC2.Types.ConversionTask
    ( ConversionTask(..)
    , ConversionTaskState(..)
    , DiskImage(..)
    , DiskImageDescription(..)
    , DiskImageVolumeDescription(..)
    , ImportInstanceTaskDetailItem(..)
    , ImportInstanceTaskDetails(..)
    , ImportVolumeRequestImage(..)
    , ImportVolumeTaskDetails(..)
    , LaunchSpecification(..)
    ) where

import AWS.EC2.Types.Common (Architecture, ShutdownBehavior)
import AWS.Lib.FromText

data ConversionTask = ConversionTask
    { conversionTaskId :: Text
    , conversionTaskExpirationTime :: Text
    , conversionTaskImportVolume :: Maybe ImportVolumeTaskDetails
    , conversionTaskImportInstance :: Maybe ImportInstanceTaskDetails
    , conversionTaskState :: ConversionTaskState
    , conversionTaskStatusMessage :: Text
    }
  deriving (Show, Read, Eq)

data ConversionTaskState
    = ConversionTaskActive
    | ConversionTaskCancelling
    | ConversionTaskCancelled
    | ConversionTaskCompleted
  deriving (Show, Read, Eq)

data DiskImage = DiskImage
    { diskImageFormat :: Text
    , diskImageBytes :: Int
    , diskImageImportManifestUrl :: Text
    , diskImageDescripsion :: Maybe Text
    , diskImageVolumeSize :: Int
    }
  deriving (Show, Read, Eq)

data DiskImageDescription = DiskImageDescription
    { diskImageDescriptionFormat :: Text
    , diskImageDescriptionSize :: Int
    , diskImageDescriptionImportManifestUrl :: Text
    , diskImageDescriptionChecksum :: Maybe Text
    }
  deriving (Show, Read, Eq)

data DiskImageVolumeDescription = DiskImageVolumeDescription
    { diskImageVolumeDescriptionSize :: Int
    , diskImageVolumeDescriptionId :: Maybe Text
    }
  deriving (Show, Read, Eq)

data ImportInstanceTaskDetailItem = ImportInstanceTaskDetailItem
    { importInstanceTaskDetailItemBytesConverted :: Int
    , importInstanceTaskDetailItemAvailabilityZone :: Text
    , importInstanceTaskDetailItemImage :: DiskImageDescription
    , importInstanceTaskDetailItemDescription :: Maybe Text
    , importInstanceTaskDetailItemVolume :: DiskImageVolumeDescription
    , importInstanceTaskDetailItemStatus :: Text
    , importInstanceTaskDetailItemStatusMessage :: Maybe Text
    }
  deriving (Show, Read, Eq)

data ImportInstanceTaskDetails = ImportInstanceTaskDetails
    { importInstanceTaskDetailsVolumes :: [ImportInstanceTaskDetailItem]
    , importInstanceTaskDetailsInstanceId :: Text
    , importInstanceTaskDetailsPlatform :: Maybe Text
    , importInstanceTaskDetailsDescription :: Maybe Text
    }
  deriving (Show, Read, Eq)

data ImportVolumeRequestImage = ImportVolumeRequestImage
    { importVolumeRequestImageFormat :: Text
    , importVolumeRequestImageBytes :: Int
    , importVolumeRequestImageImportManifestUrl :: Text
    }
  deriving (Show, Read, Eq)

data ImportVolumeTaskDetails = ImportVolumeTaskDetails
    { importVolumeTaskDetailsBytesConverted :: Int
    , importVolumeTaskDetailsAvailabilityZone :: Text
    , importVolumeTaskDetailsDescription :: Maybe Text
    , importVolumeTaskDetailsImage :: DiskImageDescription
    , importVolumeTaskDetailsVolume :: DiskImageVolumeDescription
    }
  deriving (Show, Read, Eq)

data LaunchSpecification = LaunchSpecification
    { launchSpecificationArchitecture :: Architecture
    , launchSpecificationGroupNames :: [Text]
    , launchSpecificationUserData :: Maybe Text
    , launchSpecificationInstanceType :: Text
    , launchSpecificationPlacementAvailabilityZone :: Maybe Text
    , launchSpecificationMonitoringEnabled :: Maybe Bool
    , launchSpecificationSubnetId :: Maybe Text
    , launchSpecificationInstanceInitiatedShutdownBehavior
        :: Maybe ShutdownBehavior
    , launchSpecificationPrivateIpAddress :: Maybe IPv4
    }
  deriving (Show, Read, Eq)

deriveFromText "ConversionTaskState"
    ["active", "cancelling", "cancelled", "completed"]