// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build go1.16
// +build go1.16

package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
)

// defaultDarwinDir returns a default path for a darwin VM.
//
// The directory should contain the darwin VM image, and QEMU
// (sysroot-macos-x86_64).
func defaultDarwinDir() string {
	home, err := os.UserHomeDir()
	if err != nil {
		log.Printf("os.UserHomeDir() = %q, %v", home, err)
		return ""
	}
	return home
}

// darwinCmd returns a qemu command for running a darwin VM, ready
// to be started.
func darwinCmd(base string) *exec.Cmd {
	if *macosVersion == 0 {
		log.Fatalf("-macos-version required")
	}
	if *osk == "" {
		log.Fatalf("-osk required")
	}

	sysroot := filepath.Join(base, "sysroot-macos-x86_64")
	ovmfCode := filepath.Join(sysroot, "share/qemu/edk2-x86_64-code.fd")

	disk := filepath.Join(base, "macos.qcow2")

	// Note that vmnet-shared requires that we run QEMU as root, so
	// runqemubuildlet must run as root.
	//
	// These arguments should be kept in sync with env/darwin/aws/qemu.sh.
	args := []string{
		// Discard disk changes on exit.
		"-snapshot",
		"-m", "4096",
		"-cpu", "host",
		"-machine", "q35",
		"-usb",
		"-device", "usb-kbd",
		"-device", "usb-tablet",
		// macOS only likes a power-of-two number of cores, but odd socket count is
		// fine.
		"-smp", "cpus=6,sockets=3,cores=2,threads=1",
		"-device", "usb-ehci,id=ehci",
		"-device", "nec-usb-xhci,id=xhci",
		"-global", "nec-usb-xhci.msi=off",
		"-device", fmt.Sprintf("isa-applesmc,osk=%s", *osk),
		"-drive", fmt.Sprintf("if=pflash,format=raw,readonly=on,file=%s", ovmfCode),
		"-smbios", "type=2",
		"-device", "ich9-intel-hda",
		"-device", "hda-duplex",
		"-device", "ich9-ahci,id=sata",
		"-drive", fmt.Sprintf("id=MacHDD,if=none,format=qcow2,file=%s", disk),
		"-device", "ide-hd,bus=sata.2,drive=MacHDD",
		"-monitor", "stdio",
		"-device", "VGA,vgamem_mb=128",
		"-M", "accel=hvf",
		"-display", fmt.Sprintf("vnc=127.0.0.1:%d", *guestIndex),
		// DHCP range is a dummy range. The actual guest IP is assigned statically
		// based on the MAC address matching an entry in /etc/bootptab.
		"-netdev", "vmnet-shared,id=net0,start-address=192.168.64.1,end-address=192.168.64.100,subnet-mask=255.255.255.0",
	}
	if *macosVersion >= 11 {
		args = append(args, "-device", fmt.Sprintf("virtio-net-pci,netdev=net0,id=net0,mac=52:54:00:c9:18:0%d", *guestIndex))
	} else {
		args = append(args, "-device", fmt.Sprintf("vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:0%d", *guestIndex))
	}

	cmd := exec.Command(filepath.Join(sysroot, "bin/qemu-system-x86_64"), args...)
	cmd.Env = append(os.Environ(),
		fmt.Sprintf("DYLD_LIBRARY_PATH=%s", filepath.Join(sysroot, "lib")),
	)
	return cmd
}
