package view

import (
	"fmt"
	"io/fs"
	"path/filepath"

	"github.com/kataras/iris/v12/context"
)

// walk recursively in "fileSystem" descends "root" path, calling "walkFn".
func walk(fileSystem fs.FS, root string, walkFn filepath.WalkFunc) error {
	if root != "" && root != "/" && root != "." {
		sub, err := fs.Sub(fileSystem, root)
		if err != nil {
			return err
		}
		fileSystem = sub
	}

	if root == "" {
		root = "."
	}

	return fs.WalkDir(fileSystem, root, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return fmt.Errorf("walk: %s: %w", path, err)
		}

		info, err := d.Info()
		if err != nil {
			if err != filepath.SkipDir {
				return fmt.Errorf("walk stat: %s: %w", path, err)
			}

			return nil
		}

		if info.IsDir() {
			return nil
		}

		walkFnErr := walkFn(path, info, err)
		if walkFnErr != nil {
			return fmt.Errorf("walk: walkFn: %w", walkFnErr)
		}

		return nil
	})

}

func asset(fileSystem fs.FS, name string) ([]byte, error) {
	data, err := fs.ReadFile(fileSystem, name)
	if err != nil {
		return nil, fmt.Errorf("asset: read file: %w", err)
	}

	return data, nil
}

func getFS(fsOrDir interface{}) fs.FS {
	return context.ResolveFS(fsOrDir)
}

func getRootDirName(fileSystem fs.FS) string {
	rootDirFile, err := fileSystem.Open(".")
	if err == nil {
		rootDirStat, err := rootDirFile.Stat()
		if err == nil {
			return rootDirStat.Name()
		}
	}

	return ""
}