package fs

import (
	"os"
	"path/filepath"

	"github.com/google/uuid"
)

// SymlinksSupported tests if a storage path supports symlinks.
func SymlinksSupported(storagePath string) (bool, error) {
	linkName := filepath.Join(storagePath, uuid.NewString()+"-link.tmp")
	targetName := filepath.Join(storagePath, uuid.NewString()+".tmp")

	// Delete files after test.
	defer func(link, target string) {
		_ = os.Remove(link)
		_ = os.Remove(target)
	}(linkName, targetName)

	// Create empty test target file.
	if targetFile, err := os.OpenFile(targetName, os.O_RDONLY|os.O_CREATE, ModeFile); err != nil { //nolint:gosec // targetName is validated by caller
		return false, err
	} else if err = targetFile.Close(); err != nil {
		return false, err
	}

	// Create test link.
	if err := os.Symlink(filepath.Base(targetName), linkName); err != nil {
		return false, err
	}

	// Resolve and compare test target.
	if linkTarget, err := Resolve(linkName); err != nil {
		return false, err
	} else {
		return linkTarget == targetName, nil
	}
}
