package app

import (
	"sync"

	"github.com/luthermonson/go-proxmox"
)

type Cluster struct {
	lock  sync.Mutex
	pve   ProxmoxClient
	Nodes map[string]*Node
}

type Node struct {
	lock      sync.Mutex
	Name      string                   `json:"name"`
	Cores     uint64                   `json:"cores"`
	Memory    uint64                   `json:"memory"`
	Swap      uint64                   `json:"swap"`
	Devices   map[DeviceID]*Device     `json:"devices"`
	Instances map[InstanceID]*Instance `json:"instances"`
	pvenode   *proxmox.Node
}

type InstanceID uint64
type InstanceType string

const (
	VM InstanceType = "VM"
	CT InstanceType = "CT"
)

type Instance struct {
	lock           sync.Mutex
	Type           InstanceType                 `json:"type"`
	Name           string                       `json:"name"`
	Proctype       string                       `json:"cpu"`
	Cores          uint64                       `json:"cores"`
	Memory         uint64                       `json:"memory"`
	Swap           uint64                       `json:"swap"`
	Volumes        map[VolumeID]*Volume         `json:"volumes"`
	Nets           map[NetID]*Net               `json:"nets"`
	Devices        map[InstanceDeviceID]*Device `json:"devices"`
	pveconfig      interface{}
	configDisks    map[string]string
	configNets     map[string]string
	configHostPCIs map[string]string
}

type VolumeID string
type Volume struct {
	Storage string   `json:"storage"`
	Format  string   `json:"format"`
	Size    uint64   `json:"size"`
	Volid   VolumeID `json:"volid"`
}

type NetID uint64
type Net struct {
	Value string `json:"value"`
	Rate  uint64 `json:"rate"`
	VLAN  uint64 `json:"vlan"`
}

type PVEDevice struct {
	ID                  string `json:"id"`
	DeviceName          string `json:"device_name"`
	VendorName          string `json:"vendor_name"`
	SubsystemDeviceName string `json:"subsystem_device_name"`
	SubsystemVendorName string `json:"subsystem_vendor_name"`
}

type DeviceID string
type InstanceDeviceID uint64
type Device struct {
	DeviceID   DeviceID                 `json:"device_id"`
	DeviceName string                   `json:"device_name"`
	VendorName string                   `json:"vendor_name"`
	Functions  map[FunctionID]*Function `json:"functions"`
	Reserved   bool                     `json:"reserved"`
}

type FunctionID string
type Function struct {
	FunctionID   FunctionID `json:"function_id"`
	FunctionName string     `json:"subsystem_device_name"`
	VendorName   string     `json:"subsystem_vendor_name"`
	Reserved     bool       `json:"reserved"`
}