package disks

// Main information about IO tune
type IOTune struct {
	// ReadBytesSec
	ReadBytesSec uint64 `json:"read_bytes_sec"`

	// ReadBytesSecMax
	ReadBytesSecMax uint64 `json:"read_bytes_sec_max"`

	// ReadIOPSSec
	ReadIOPSSec uint64 `json:"read_iops_sec"`

	// ReadIOPSSecMax
	ReadIOPSSecMax uint64 `json:"read_iops_sec_max"`

	// SizeIOPSSec
	SizeIOPSSec uint64 `json:"size_iops_sec"`

	// TotalBytesSec
	TotalBytesSec uint64 `json:"total_bytes_sec"`

	// TotalBytesSecMax
	TotalBytesSecMax uint64 `json:"total_bytes_sec_max"`

	// TotalIOPSSec
	TotalIOPSSec uint64 `json:"total_iops_sec"`

	// TotalIOPSSecMax
	TotalIOPSSecMax uint64 `json:"total_iops_sec_max"`

	// WriteBytesSec
	WriteBytesSec uint64 `json:"write_bytes_sec"`

	// WriteBytesSecMax
	WriteBytesSecMax uint64 `json:"write_bytes_sec_max"`

	// WriteIOPSSec
	WriteIOPSSec uint64 `json:"write_iops_sec"`

	// WriteIOPSSecMax
	WriteIOPSSecMax uint64 `json:"write_iops_sec_max"`
}

// Main information about disks
type InfoDisk struct {
	// Account ID
	AccountID uint64 `json:"accountId"`

	// Account name
	AccountName string `json:"accountName"`

	// Access Control Control
	ACL map[string]interface{} `json:"acl"`

	// BLK Discard
	BLKDiscard bool `json:"blkdiscard"`

	// Block size of disk
	BlockSize string `json:"block_size"`

	// Boot partition
	BootPartition uint64 `json:"bootPartition"`

	// Computes
	Computes map[string]string `json:"computes"`

	// Created time
	CreatedTime uint64 `json:"createdTime"`

	// Deleted time
	DeletedTime uint64 `json:"deletedTime"`

	// Description
	Description string `json:"desc"`

	// Destruction time
	DestructionTime uint64 `json:"destructionTime"`

	// Disk path
	DiskPath string `json:"diskPath"`

	// Grid ID
	GID uint64 `json:"gid"`

	// GUID
	GUID uint64 `json:"guid"`

	// ID
	ID uint64 `json:"id"`

	// Image ID
	ImageID uint64 `json:"imageId"`

	// List of image IDs
	Images []uint64 `json:"images"`

	// IOTune
	IOTune IOTune `json:"iotune"`

	// IQN
	IQN string `json:"iqn"`

	// Login
	Login string `json:"login"`

	// Milestones
	Milestones uint64 `json:"milestones"`

	// Name
	Name string `json:"name"`

	// Order
	Order uint64 `json:"order"`

	// Params
	Params string `json:"params"`

	// Parent ID
	ParentID uint64 `json:"parentId"`

	// Password
	Password string `json:"passwd"`

	// PCI slot
	PCISlot int64 `json:"pciSlot"`

	// Pool
	Pool string `json:"pool"`

	// Present to
	PresentTo map[string]uint64 `json:"presentTo"`

	// Provision
	Provision string `json:"provision"`

	// Purge attempts
	PurgeAttempts uint64 `json:"purgeAttempts"`

	// Purge time
	PurgeTime uint64 `json:"purgeTime"`

	// Reality device number
	RealityDeviceNumber uint64 `json:"realityDeviceNumber"`

	// Reference ID
	ReferenceID string `json:"referenceId"`

	// Replication
	Replication ItemReplication `json:"replication"`

	// Resource ID
	ResID string `json:"resId"`

	// Resource name
	ResName string `json:"resName"`

	// Role
	Role string `json:"role"`

	// SEP ID
	SEPID uint64 `json:"sepId"`

	// Shareable
	Shareable bool `json:"shareable"`

	// Size available
	SizeAvailable float64 `json:"sizeAvailable"`

	// Size max
	SizeMax int64 `json:"sizeMax"`

	// Size used
	SizeUsed float64 `json:"sizeUsed"`

	// List snapshots
	Snapshots ListSnapshots `json:"snapshots"`

	// Status
	Status string `json:"status"`

	// Storage policy ID
	StoragePolicyID uint64 `json:"storage_policy_id"`

	// Tech status
	TechStatus string `json:"techStatus"`

	// Need to clean before destroy
	ToClean bool `json:"to_clean"`

	// Virtual machine ID
	VMID uint64 `json:"vmid"`

	// Updated by
	UpdatedBy string `json:"updatedBy"`

	// Cache mode of disk
	Cache string `json:"cache"`
}

type ItemReplication struct {
	// DiskID
	DiskID uint64 `json:"diskId"`

	// PoolID
	PoolID string `json:"poolId"`

	// Role
	Role string `json:"role"`

	// SelfVolumeID
	SelfVolumeID string `json:"selfVolumeId"`

	// StorageID
	StorageID string `json:"storageId"`

	// VolumeID
	VolumeID string `json:"volumeId"`
}

// Detailed indormation about disk
type RecordDisk struct {

	// Block size of disk
	BlockSize string `json:"block_size"`

	//Created by
	CreatedBy string `json:"createdBy"`

	//Deleted by
	DeletedBy string `json:"deletedBy"`

	// Device name
	DeviceName string `json:"devicename"`

	// SEP type
	SEPType string `json:"sepType"`

	// Machine ID
	MachineID uint64 `json:"machineId"`

	// Machine name
	MachineName string `json:"machineName"`

	// Main information about disk
	InfoDisk

	// Independent
	Independent bool `json:"independent"`

	//Updated by
	UpdatedBy string `json:"updatedBy"`

	// Update time
	UpdatedTime uint64 `json:"updatedTime"`
}

// Main information for list disks
type ItemDisk struct {

	// Detailed information about disk
	RecordDisk
}

// List disks
type ListDisks struct {
	// Data
	Data []ItemDisk `json:"data"`

	// Entry count
	EntryCount uint64 `json:"entryCount"`
}

// ListSearchDisks
type SearchListDisks []ItemDisk

// Main information about unattached disk
type ItemUnattachedDisk struct {
	// Meta
	Meta []interface{} `json:"_meta"`

	// Main information about disk
	InfoDisk

	// Updated by
	UpdatedBy uint64 `json:"updatedBy"`

	// Updated time
	UpdatedTime uint64 `json:"updatedTime"`
}

// List unattached disks
type ListUnattachedDisks struct {
	// Data
	Data []ItemUnattachedDisk `json:"data"`

	// Entry count
	EntryCount uint64 `json:"entryCount"`
}

// Main information about snapshot
type ItemSnapshot struct {
	// GUID
	GUID string `json:"guid"`

	// Label
	Label string `json:"label"`

	// Reference ID
	ReferenceID string `json:"referenceId"`

	// Resource ID
	ResID string `json:"resId"`

	// SnapSet GUID
	SnapSetGUID string `json:"snapSetGuid"`

	// SnapSet time
	SnapSetTime uint64 `json:"snapSetTime"`

	// Timestamp
	Timestamp uint64 `json:"timestamp"`
}

// List snapshots
type ListSnapshots []ItemSnapshot

type MigrateStatus struct {
	// Type
	Type int `json:"type"`

	// Copy speed
	Bandwidth int `json:"bandwidth"`

	// Current progress
	Cur interface{} `json:"cur"`

	// Total size
	End interface{} `json:"end"`

	// Progress percent
	ProgressPercent int `json:"progress_percent"`
}
