package models

import (
	"github.com/hashicorp/terraform-plugin-framework-timeouts/datasource/timeouts"
	"github.com/hashicorp/terraform-plugin-framework/types"
)

type ListDisksModel struct {
	// request fields
	ByID        types.Int64    `tfsdk:"by_id"`
	Name        types.String   `tfsdk:"name"`
	AccountName types.String   `tfsdk:"account_name"`
	DiskMaxSize types.Int64    `tfsdk:"disk_max_size"`
	Shared      types.Bool     `tfsdk:"shared"`
	AccountID   types.Int64    `tfsdk:"account_id"`
	Type        types.String   `tfsdk:"type"`
	SortBy      types.String   `tfsdk:"sort_by"`
	Page        types.Int64    `tfsdk:"page"`
	Size        types.Int64    `tfsdk:"size"`
	Timeouts    timeouts.Value `tfsdk:"timeouts"`

	//computed fields
	Items      []ItemDiskModel `tfsdk:"items"`
	EntryCount types.Int64     `tfsdk:"entry_count"`
}

type ItemDiskModel struct {
	MachineID           types.Int64           `tfsdk:"machine_id"`
	MachineName         types.String          `tfsdk:"machine_name"`
	DeviceName          types.String          `tfsdk:"devicename"`
	SEPType             types.String          `tfsdk:"sep_type"`
	AccountID           types.Int64           `tfsdk:"account_id"`
	AccountName         types.String          `tfsdk:"account_name"`
	ACL                 types.String          `tfsdk:"acl"`
	BootPartition       types.Int64           `tfsdk:"boot_partition"`
	Computes            []ComputesModel       `tfsdk:"computes"`
	CreatedTime         types.Int64           `tfsdk:"created_time"`
	DeletedTime         types.Int64           `tfsdk:"deleted_time"`
	Description         types.String          `tfsdk:"desc"`
	DestructionTime     types.Int64           `tfsdk:"destruction_time"`
	DiskPath            types.String          `tfsdk:"disk_path"`
	GID                 types.Int64           `tfsdk:"gid"`
	GUID                types.Int64           `tfsdk:"guid"`
	ID                  types.Int64           `tfsdk:"disk_id"`
	ImageID             types.Int64           `tfsdk:"image_id"`
	Images              types.List            `tfsdk:"images"`
	IOTune              *IOTuneModel          `tfsdk:"iotune"`
	IQN                 types.String          `tfsdk:"iqn"`
	Login               types.String          `tfsdk:"login"`
	Milestones          types.Int64           `tfsdk:"milestones"`
	Name                types.String          `tfsdk:"disk_name"`
	Order               types.Int64           `tfsdk:"order"`
	Params              types.String          `tfsdk:"params"`
	ParentID            types.Int64           `tfsdk:"parent_id"`
	Password            types.String          `tfsdk:"passwd"`
	PCISlot             types.Int64           `tfsdk:"pci_slot"`
	Pool                types.String          `tfsdk:"pool"`
	PresentTo           types.List            `tfsdk:"present_to"`
	PurgeAttempts       types.Int64           `tfsdk:"purge_attempts"`
	PurgeTime           types.Int64           `tfsdk:"purge_time"`
	RealityDeviceNumber types.Int64           `tfsdk:"reality_device_number"`
	ReferenceID         types.String          `tfsdk:"reference_id"`
	Replication         *ItemReplicationModel `tfsdk:"replication"`
	ResID               types.String          `tfsdk:"res_id"`
	ResName             types.String          `tfsdk:"res_name"`
	Role                types.String          `tfsdk:"role"`
	SEPID               types.Int64           `tfsdk:"sep_id"`
	Shareable           types.Bool            `tfsdk:"shareable"`
	SizeMax             types.Int64           `tfsdk:"size_max"`
	SizeUsed            types.Float64         `tfsdk:"size_used"`
	Snapshots           []ItemSnapshotModel   `tfsdk:"snapshots"`
	Status              types.String          `tfsdk:"status"`
	TechStatus          types.String          `tfsdk:"tech_status"`
	Type                types.String          `tfsdk:"type"`
	VMID                types.Int64           `tfsdk:"vmid"`
}

type ComputesModel struct {
	ComputeID   types.String `tfsdk:"compute_id"`
	ComputeName types.String `tfsdk:"compute_name"`
}

type ItemReplicationModel struct {
	DiskID       types.Int64  `tfsdk:"disk_id"`
	PoolID       types.String `tfsdk:"pool_id"`
	Role         types.String `tfsdk:"role"`
	SelfVolumeID types.String `tfsdk:"self_volume_id"`
	StorageID    types.String `tfsdk:"storage_id"`
	VolumeID     types.String `tfsdk:"volume_id"`
}

type IOTuneModel struct {
	ReadBytesSec     types.Int64 `tfsdk:"read_bytes_sec"`
	ReadBytesSecMax  types.Int64 `tfsdk:"read_bytes_sec_max"`
	ReadIOPSSec      types.Int64 `tfsdk:"read_iops_sec"`
	ReadIOPSSecMax   types.Int64 `tfsdk:"read_iops_sec_max"`
	SizeIOPSSec      types.Int64 `tfsdk:"size_iops_sec"`
	TotalBytesSec    types.Int64 `tfsdk:"total_bytes_sec"`
	TotalBytesSecMax types.Int64 `tfsdk:"total_bytes_sec_max"`
	TotalIOPSSec     types.Int64 `tfsdk:"total_iops_sec"`
	TotalIOPSSecMax  types.Int64 `tfsdk:"total_iops_sec_max"`
	WriteBytesSec    types.Int64 `tfsdk:"write_bytes_sec"`
	WriteBytesSecMax types.Int64 `tfsdk:"write_bytes_sec_max"`
	WriteIOPSSec     types.Int64 `tfsdk:"write_iops_sec"`
	WriteIOPSSecMax  types.Int64 `tfsdk:"write_iops_sec_max"`
}

type ItemSnapshotModel struct {
	GUID        types.String `tfsdk:"guid"`
	Label       types.String `tfsdk:"label"`
	ReferenceID types.String `tfsdk:"reference_id"`
	ResID       types.String `tfsdk:"res_id"`
	SnapSetGUID types.String `tfsdk:"snap_set_guid"`
	SnapSetTime types.Int64  `tfsdk:"snap_set_time"`
	Timestamp   types.Int64  `tfsdk:"timestamp"`
}
