package container

import (
	"path"
	"path/filepath"
	"sort"
	"strings"

	"github.com/warewulf/warewulf/internal/pkg/wwlog"
)

var (
	kernelNames = []string{
		`vmlinux`,
		`vmlinuz`,
		`vmlinux-*`,
		`vmlinuz-*`,
		`vmlinuz.gz`}

	kernelDirs = []string{
		`/lib/modules/*/`,
		`/boot/`}
)

func KernelFind(container string) string {
	wwlog.Debug("Finding kernel")
	container_path := RootFsDir(container)
	if container_path == "" {
		return ""
	}

	for _, kdir := range kernelDirs {
		wwlog.Debug("Checking kernel directory: %s", kdir)
		for _, kname := range kernelNames {
			wwlog.Debug("Checking for kernel name: %s", kname)
			kernelPaths, err := filepath.Glob(path.Join(container_path, kdir, kname))
			if err != nil {
				return ""
			}

			if len(kernelPaths) == 0 {
				continue
			}

			sort.Slice(kernelPaths, func(i, j int) bool {
				return kernelPaths[i] > kernelPaths[j]
			})

			for _, kernelPath := range kernelPaths {
				wwlog.Debug("Checking for kernel path: %s", kernelPath)
				// Only succeeds if kernelPath exists and, if a
				// symlink, links to a path that also exists
				kernelPath, err = filepath.EvalSymlinks(kernelPath)
				if err == nil {
					wwlog.Debug("found kernel: %s", kernelPath)
					return kernelPath
				}
			}
		}
	}

	return ""
}

func KernelVersion(container string) string {
	wwlog.Debug("Finding kernel version inside container: %s", container)
	kernel := KernelFind(container)
	if kernel == "" {
		return ""
	}

	ret := path.Base(path.Dir(kernel))
	if ret == "boot" {
		ret = path.Base(kernel)
	}

	return strings.TrimPrefix(ret, "vmlinuz-")
}
