package fsutils

import (
	"errors"
	"fmt"
	"io/fs"
	"os"
	"path/filepath"
	"strings"
)

func FindFiles(root, name string) []string {
	paths := []string{}

	filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return nil
		}

		if !d.IsDir() && filepath.Base(path) == name && !strings.Contains(path, "node_modules") {
			paths = append(paths, path)
		}

		return nil
	})

	return paths
}

func IsFile(path string) bool {
	stat, err := os.Stat(path)

	if errors.Is(err, os.ErrNotExist) {
		return false
	}

	return !stat.IsDir()
}

func IsDir(path string) bool {
	stat, err := os.Stat(path)

	if errors.Is(err, os.ErrNotExist) {
		os.MkdirAll(path, 0755)
		return true
	}

	return err == nil && stat.IsDir()
}

func ResolvePath(path string) string {
	// We assume that the user doesn't use the involved feature if the path is empty.
	if path == "" {
		return ""
	}

	expandedPath := os.ExpandEnv(path)

	if strings.HasPrefix(expandedPath, "~") {
		homeDir, err := os.UserHomeDir()
		if err != nil {
			fmt.Println(err.Error())
			os.Exit(1)
		}
		expandedPath = filepath.Join(homeDir, expandedPath[1:])
	}

	path, err := filepath.Abs(expandedPath)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}

	return path
}