package files

import (
	"net/url"
	"os"
	"path/filepath"
	"time"
)

const FileDateFormat = "2006-01-02 15:04:05 MST"

type DirStat struct {
	Files       int64
	FilesSize   string
	Directories int64
}

type DirEntry struct {
	Name     string
	Link     string
	Datetime time.Time
	Size     string
}

func ScanDirectory(path, urlBase string) (entries []DirEntry, stats DirStat, err error) {
	dir, err := os.ReadDir(path)
	if err != nil {
		return
	}

	var dirEntries []DirEntry = make([]DirEntry, 0)
	var fileEntries []DirEntry = make([]DirEntry, 0)
	var totalFilesSize int64 = 0

	for _, ent := range dir {
		entry, _ := ent.Info()

		var isDirLink bool
		if entry.Mode().Type()&os.ModeSymlink != 0 {
			if slp, err := filepath.EvalSymlinks(filepath.Join(path, entry.Name())); err == nil {
				lStat, _ := os.Lstat(slp)
				isDirLink = lStat.IsDir()
			}
		}

		if entry.IsDir() || isDirLink {
			dirEntries = append(dirEntries, DirEntry{
				Name:     entry.Name(),
				Link:     url.PathEscape(entry.Name()) + "/",
				Datetime: entry.ModTime(),
				Size:     "DIR",
			})
			stats.Directories++
		} else {
			fileEntries = append(fileEntries, DirEntry{
				Name:     entry.Name(),
				Link:     "/file" + urlBase + url.PathEscape(entry.Name()),
				Datetime: entry.ModTime(),
				Size:     convertFileSize(entry.Size()),
			})

			totalFilesSize += entry.Size()
			stats.Files++
		}
	}

	stats.FilesSize = convertFileSize(totalFilesSize)

	entries = append(entries, dirEntries...)
	entries = append(entries, fileEntries...)

	return
}