package system

import (
	"github.com/beclab/Olares/cli/pkg/common"
	"github.com/beclab/Olares/cli/pkg/core/module"
)

func isGpuSupportOs(runtime *common.KubeRuntime) bool {
	systemInfo := runtime.GetSystemInfo()
	if systemInfo.IsUbuntu() || systemInfo.IsDebian() {
		return true
	}

	return false
}

type phase []module.Module

func (p phase) addModule(m ...module.Module) phase {
	return append(p, m...)
}

type cloudModuleBuilder func() []module.Module

func (m cloudModuleBuilder) withCloud(runtime *common.KubeRuntime) []module.Module {
	if runtime.Arg.IsCloudInstance {
		return m()
	}

	return nil
}

func (m cloudModuleBuilder) withoutCloud(runtime *common.KubeRuntime) []module.Module {
	if !runtime.Arg.IsCloudInstance {
		return m()
	}

	return nil
}

type gpuModuleBuilder func() []module.Module

func (m gpuModuleBuilder) withGPU(runtime *common.KubeRuntime) []module.Module {
	if runtime.Arg.GPU.Enable && isGpuSupportOs(runtime) {
		return m()
	}

	return nil
}

type terminusBoxModuleBuilder func() []module.Module

func (m terminusBoxModuleBuilder) inBox(runtime *common.KubeRuntime) []module.Module {
	if runtime.GetSystemInfo().IsDarwin() {
		return nil
	}
	return m()
}
