package disks

import (
	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func resourceDiskV1() *schema.Resource {
	return &schema.Resource{
		Schema: map[string]*schema.Schema{
			"account_id": {
				Type:     schema.TypeInt,
				Required: true,
				//ForceNew: true,
			},
			"gid": {
				Type:     schema.TypeInt,
				Required: true,
				//ForceNew: true,
			},
			"disk_name": {
				Type:     schema.TypeString,
				Required: true,
			},
			"type": {
				Type:         schema.TypeString,
				Required:     true,
				ValidateFunc: validation.StringInSlice([]string{"D", "B", "T"}, false),
				Description:  "The type of disk in terms of its role in compute: 'B=Boot, D=Data, T=Temp'",
			},

			"desc": {
				Type:     schema.TypeString,
				Optional: true,
				Computed: true,
			},
			"size_max": {
				Type:     schema.TypeInt,
				Required: true,
			},
			"ssd_size": {
				Type:     schema.TypeInt,
				Optional: true,
			},
			"iops": {
				Type:        schema.TypeInt,
				Optional:    true,
				Description: "max IOPS disk can perform",
			},
			"sep_id": {
				Type:     schema.TypeInt,
				Optional: true,
				Computed: true,
			},
			"pool": {
				Type:     schema.TypeString,
				Optional: true,
				Computed: true,
			},
			"node_ids": {
				Type:     schema.TypeSet,
				Optional: true,
				Elem: &schema.Schema{
					Type: schema.TypeInt,
				},
			},
			"detach": {
				Type:        schema.TypeBool,
				Optional:    true,
				Default:     false,
				Description: "detach disk from machine first",
			},
			"permanently": {
				Type:        schema.TypeBool,
				Optional:    true,
				Default:     false,
				Description: "whether to completely delete the disk, works only with non attached disks",
			},
			"shareable": {
				Type:     schema.TypeBool,
				Optional: true,
				Computed: true,
			},
			"restore": {
				Type:        schema.TypeBool,
				Optional:    true,
				Default:     false,
				Description: "restore deleting disk",
			},
			"account_name": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"acl": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"boot_partition": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"computes": {
				Type:     schema.TypeList,
				Computed: true,
				Elem: &schema.Resource{
					Schema: map[string]*schema.Schema{
						"compute_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"compute_name": {
							Type:     schema.TypeString,
							Computed: true,
						},
					},
				},
			},
			"created_time": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"deleted_time": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"destruction_time": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"devicename": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"disk_path": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"guid": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"disk_id": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"image_id": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"images": {
				Type:     schema.TypeList,
				Computed: true,
				Elem: &schema.Schema{
					Type: schema.TypeString,
				},
			},
			"iotune": {
				Type:     schema.TypeList,
				Optional: true,
				MaxItems: 1,
				Computed: true,
				Elem: &schema.Resource{
					Schema: map[string]*schema.Schema{
						"read_bytes_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"read_bytes_sec_max": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"read_iops_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"read_iops_sec_max": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"size_iops_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"total_bytes_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"total_bytes_sec_max": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"total_iops_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"total_iops_sec_max": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"write_bytes_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"write_bytes_sec_max": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"write_iops_sec": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
						"write_iops_sec_max": {
							Type:     schema.TypeInt,
							Optional: true,
							Computed: true,
						},
					},
				},
			},
			"iqn": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"login": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"milestones": {
				Type:     schema.TypeInt,
				Computed: true,
			},

			"order": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"params": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"parent_id": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"passwd": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"pci_slot": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"present_to": {
				Type:     schema.TypeList,
				Computed: true,
				Elem: &schema.Schema{
					Type: schema.TypeInt,
				},
			},
			"purge_attempts": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"purge_time": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"replication": {
				Type:     schema.TypeList,
				Computed: true,
				Elem: &schema.Resource{
					Schema: map[string]*schema.Schema{
						"disk_id": {
							Type:     schema.TypeInt,
							Computed: true,
						},
						"pool_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"role": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"self_volume_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"storage_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"volume_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
					},
				},
				Description: "Replication status",
			},
			"reality_device_number": {
				Type:     schema.TypeInt,
				Computed: true,
			},
			"reference_id": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"res_id": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"res_name": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"role": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"sep_type": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"size_used": {
				Type:     schema.TypeFloat,
				Computed: true,
			},
			"snapshots": {
				Type:     schema.TypeList,
				Computed: true,
				Elem: &schema.Resource{
					Schema: map[string]*schema.Schema{
						"guid": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"label": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"reference_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"res_id": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"snap_set_guid": {
							Type:     schema.TypeString,
							Computed: true,
						},
						"snap_set_time": {
							Type:     schema.TypeInt,
							Computed: true,
						},
						"timestamp": {
							Type:     schema.TypeInt,
							Computed: true,
						},
					},
				},
			},
			"status": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"tech_status": {
				Type:     schema.TypeString,
				Computed: true,
			},
			"vmid": {
				Type:     schema.TypeInt,
				Computed: true,
			},
		},
	}
}
