package schemas

import (
	"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
	"github.com/hashicorp/terraform-plugin-framework/resource/schema"
	"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
	"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
	"github.com/hashicorp/terraform-plugin-framework/schema/validator"
	"github.com/hashicorp/terraform-plugin-framework/types"
)

func MakeSchemaResourceImage() map[string]schema.Attribute {
	return map[string]schema.Attribute{
		// required attributes
		"image_name": schema.StringAttribute{
			Required:    true,
			Description: "Name of the rescue disk",
		},
		"url": schema.StringAttribute{
			Required:    true,
			Description: "URL where to download media from",
		},
		"boot_type": schema.StringAttribute{
			Required: true,
			Validators: []validator.String{
				stringvalidator.OneOf("bios", "uefi"),
			},
			Description: "Boot type of image bios or uefi",
		},
		"image_type": schema.StringAttribute{
			Required: true,
			Validators: []validator.String{
				stringvalidator.OneOf("linux", "windows", "unknown"),
			},
			Description: "Image type linux, windows or unknown",
		},
		"drivers": schema.ListAttribute{
			Required:    true,
			ElementType: types.StringType,
			Description: "List of types of compute suitable for image. Example: [ \"KVM_X86\" ]",
		},
		"account_id": schema.Int64Attribute{
			Required:    true,
			Description: "AccountId to make the image exclusive",
		},
		// optional attributes
		"hot_resize": schema.BoolAttribute{
			Computed:    true,
			Optional:    true,
			Description: "Does this machine supports hot resize",
		},
		"network_interface_naming": schema.StringAttribute{
			Computed: true,
		},
		"username": schema.StringAttribute{
			Computed:    true,
			Optional:    true,
			Description: "Optional username for the image",
		},
		"password": schema.StringAttribute{
			Computed:    true,
			Optional:    true,
			Description: "Optional password for the image",
		},
		"username_dl": schema.StringAttribute{
			Optional:    true,
			Description: "Username for upload binary media",
		},
		"password_dl": schema.StringAttribute{
			Optional:    true,
			Description: "Password for upload binary media",
		},
		"sep_id": schema.Int64Attribute{
			Computed:    true,
			Optional:    true,
			Description: "Storage endpoint provider ID",
		},
		"pool_name": schema.StringAttribute{
			Computed:    true,
			Optional:    true,
			Description: "Pool for image create",
		},
		"architecture": schema.StringAttribute{
			Computed: true,
			Optional: true,
			Validators: []validator.String{
				stringvalidator.OneOf("X86_64"),
			},
			Description: "Binary architecture of this image, one of X86_64",
		},
		// computed attributes
		"id": schema.StringAttribute{
			Computed: true,
			PlanModifiers: []planmodifier.String{
				stringplanmodifier.UseStateForUnknown(),
			},
		},
		"last_updated": schema.StringAttribute{
			Computed:    true,
			Description: "Timestamp of the last Terraform update of the order.",
		},
		"unc_path": schema.StringAttribute{
			Computed: true,
		},
		"ckey": schema.StringAttribute{
			Computed: true,
		},
		"acl": schema.ListAttribute{
			Computed:    true,
			ElementType: types.StringType,
		},
		"bootable": schema.BoolAttribute{
			Computed: true,
		},
		"compute_ci_id": schema.Int64Attribute{
			Computed: true,
		},
		"cd_presented_to": schema.StringAttribute{
			Computed: true,
		},
		"gid": schema.Int64Attribute{
			Computed: true,
		},
		"deleted_time": schema.Int64Attribute{
			Computed: true,
		},
		"desc": schema.StringAttribute{
			Computed: true,
		},
		"enabled": schema.BoolAttribute{
			Computed: true,
		},
		"guid": schema.Int64Attribute{
			Computed: true,
		},
		"history": schema.ListNestedAttribute{
			Computed: true,
			NestedObject: schema.NestedAttributeObject{
				Attributes: map[string]schema.Attribute{
					"guid": schema.StringAttribute{
						Computed: true,
					},
					"id": schema.Int64Attribute{
						Computed: true,
					},
					"timestamp": schema.Int64Attribute{
						Computed: true,
					},
				},
			},
		},
		"last_modified": schema.Int64Attribute{
			Computed: true,
		},
		"link_to": schema.Int64Attribute{
			Computed: true,
		},
		"milestones": schema.Int64Attribute{
			Computed: true,
		},
		"image_id": schema.Int64Attribute{
			Computed: true,
		},
		"provider_name": schema.StringAttribute{
			Computed: true,
		},
		"purge_attempts": schema.Int64Attribute{
			Computed: true,
		},
		"present_to": schema.MapAttribute{
			Computed:    true,
			ElementType: types.Int64Type,
		},
		"res_id": schema.StringAttribute{
			Computed: true,
		},
		"rescuecd": schema.BoolAttribute{
			Computed: true,
		},
		"shared_with": schema.ListAttribute{
			Computed:    true,
			ElementType: types.Int64Type,
		},
		"size": schema.Int64Attribute{
			Computed: true,
		},
		"snapshot_id": schema.StringAttribute{
			Computed: true,
		},
		"status": schema.StringAttribute{
			Computed: true,
		},
		"tech_status": schema.StringAttribute{
			Computed: true,
		},
		"version": schema.StringAttribute{
			Computed: true,
		},
	}
}
