################################################
# 作者：gfdgd xi
# 版本：1.0
# 依照 GPL V3 协议开源
################################################
# 参考文献：
#     https://juejin.cn/post/7080484519328874510
################################################
import os
import subprocess

homePath = os.path.expanduser('~')
programPath = os.path.split(os.path.realpath(__file__))[0]

class File:
    def __init__(self, path) -> None:
        self.path = path

    def getFileFolderSize(self):
        """get size for file or folder"""
        totalSize = 0
        if not os.path.exists(self.path):
            return totalSize
        if os.path.isfile(self.path):
            totalSize = os.path.getsize(self.path)  # 5041481
            return totalSize
        if os.path.isdir(self.path):
            with os.scandir(self.path) as dirEntryList:
                for curSubEntry in dirEntryList:
                    curSubEntryFullPath = os.path.join(self.path, curSubEntry.name)
                    if curSubEntry.is_dir():
                        curSubFolderSize = self.path(curSubEntryFullPath)  # 5800007
                        totalSize += curSubFolderSize
                    elif curSubEntry.is_file():
                        curSubFileSize = os.path.getsize(curSubEntryFullPath)  # 1891
                        totalSize += curSubFileSize
                return totalSize

class Manager:
    def __init__(self, name: str, managerPath: str="VBoxManage") -> None:
        self.name = name
        self.managerPath = managerPath
        self.vboxVersion = subprocess.getoutput(f"\"{self.managerPath}\" -v")

    def Create(self, type: str="Windows7") -> None:
        os.system(f"\"{self.managerPath}\" createvm --name \"{self.name}\" --ostype \"{type}\" --register")

    def CreateDisk(self, path: str, size: int) -> None:
        os.system(f"\"{self.managerPath}\" createvdi --filename \"{path}\" --size \"{size}\"")

    def CreateDiskControl(self, controlName: str="storage_controller_1") -> None:
        os.system(f"\"{self.managerPath}\" storagectl \"{self.name}\" --name \"{controlName}\" --add ide")

    def MountDisk(self, diskPath: str, controlName: str="storage_controller_1", port: int=0, device: int=0) -> None:
        os.system(f"\"{self.managerPath}\" storageattach \"{self.name}\" --storagectl \"{controlName}\" --type hdd --port {port} --device {device} --medium \"{diskPath}\"")

    def MountISO(self, isoPath: str, controlName: str="storage_controller_1", port: int=1, device: int=0) -> None:
        os.system(f"\"{self.managerPath}\" storageattach \"{self.name}\" --storagectl \"{controlName}\" --type dvddrive --port {port} --device {device} --medium \"{isoPath}\"")

    def BootFirst(self, bootDrive: str) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --boot1 {bootDrive}")

    def SetNetBridge(self, netDriver: str) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --nic1 bridged --cableconnected1 on --nictype1 82540EM --bridgeadapter1 \"{netDriver}\" --intnet1 brigh1 --macaddress1 auto")
        #os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --nic1 hostif")
        pass

    def SetCPU(self, number: int) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --cpus {number}")

    def SetMemory(self, memory: int) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --memory {memory}")

    def SetRemote(self, setting: bool) -> None:
        if setting:
            os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vrde on")
            return
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vrde off")

    def SetRemoteConnectSetting(self, port: int=5540) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vrdeport {port} --vrdeaddress """)

    def Start(self, unShown: bool = False) -> None:
        if unShown:
            os.system(f"\"{self.managerPath}\" startvm \"{self.name}\" -type headless")
            return
        os.system(f"\"{self.managerPath}\" startvm \"{self.name}\"")

    def Stop(self) -> None:
        os.system(f"\"{self.managerPath}\" controlvm \"{self.name}\" poweroff")

    def Delete(self) -> None:
        os.system(f"\"{self.managerPath}\" unregistervm --delete \"{self.name}\"")
    
    def SetDisplayMemory(self, memory: int) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --vram {memory}")

    def InstallGuessAdditions(self, controlName: str="storage_controller_1", port: int=1, device: int=0) -> None:
        self.MountISO("/usr/share/virtualbox/VBoxGuestAdditions.iso", controlName, port, device)

    def EnabledAudio(self) -> None:
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --audio pulse --audiocontroller hda --audioin on --audioout on")
        #os.system("")

    def EnabledClipboardMode(self):
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --clipboard-mode bidirectional")

    def EnabledDraganddrop(self):
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --draganddrop bidirectional")

    def ShareFile(self, name, path):
        os.system(f"\"{self.managerPath}\" sharedfolder add \"{self.name}\" -name \"{name}\" -hostpath \"{path}\"")

    def SetVBoxSVGA(self):
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --graphicscontroller vboxsvga")

    def SetMousePS2(self):
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --mouse usb")

    def SetKeyboardPS2(self):
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --keyboard usb")

    def OpenUSB(self):
        os.system(f"\"{self.managerPath}\" modifyvm \"{self.name}\" --usbohci on")
        pass