/*
ファイル保存領域のディレクトリをスキャンして一覧を作成する処理
*/

package Storage

import (
	"fmt"
	"os"
	"path"
	"path/filepath"
	"strings"
)

var (
	debug_mode = false
)

/*
 ファイル一覧を保持する構造体
*/
type StorageResource struct {
	list []string
	top  string
}

/*
 エントリが見つかった場合の処理
*/
func (s *StorageResource) walk_fn(path string, info os.FileInfo, err error) error {
	if debug_mode {
		fmt.Println(path)
	}
	if !info.IsDir() {
		//ディレクトリ以外にはファイルしか置かれないので、その場合一覧に追加する
		if debug_mode {
			fmt.Println("found file: " + path)
		}
		p := strings.Replace(path, s.top, "", 1)
		s.list = append(s.list, p)
	}
	return nil
}

/*
 ファイル一覧を返す関数
*/
func (s *StorageResource) FileList() []string {
	dir := s.top
	if debug_mode {
		fmt.Println("listing at " + dir)
	}

	err := filepath.Walk(dir, s.walk_fn)
	if err != nil {
		fmt.Println("path walk error on " + dir)
		return nil
	}
	if debug_mode {
		fmt.Println(s.list)
	}
	return s.list
}

/*
 ファイル一覧を管理するオブジェクトを生成する
*/
func NewStorageResource(dir string) *StorageResource {
	sr := new(StorageResource)
	sr.top = path.Clean(dir)
	sr.list = make([]string, 0, 10)
	return sr
}
