package setup
import (
	"fmt"
	"io/ioutil"
	"text/template"
	"github.com/mholt/caddy/middleware"
	"github.com/mholt/caddy/middleware/browse"
)
// Browse configures a new Browse middleware instance.
func Browse(c *Controller) (middleware.Middleware, error) {
	configs, err := browseParse(c)
	if err != nil {
		return nil, err
	}
	browse := browse.Browse{
		Root:          c.Root,
		Configs:       configs,
		IgnoreIndexes: false,
	}
	return func(next middleware.Handler) middleware.Handler {
		browse.Next = next
		return browse
	}, nil
}
func browseParse(c *Controller) ([]browse.Config, error) {
	var configs []browse.Config
	appendCfg := func(bc browse.Config) error {
		for _, c := range configs {
			if c.PathScope == bc.PathScope {
				return fmt.Errorf("duplicate browsing config for %s", c.PathScope)
			}
		}
		configs = append(configs, bc)
		return nil
	}
	for c.Next() {
		var bc browse.Config
		// First argument is directory to allow browsing; default is site root
		if c.NextArg() {
			bc.PathScope = c.Val()
		} else {
			bc.PathScope = "/"
		}
		// Second argument would be the template file to use
		var tplText string
		if c.NextArg() {
			tplBytes, err := ioutil.ReadFile(c.Val())
			if err != nil {
				return configs, err
			}
			tplText = string(tplBytes)
		} else {
			tplText = defaultTemplate
		}
		// Build the template
		tpl, err := template.New("listing").Parse(tplText)
		if err != nil {
			return configs, err
		}
		bc.Template = tpl
		// Save configuration
		err = appendCfg(bc)
		if err != nil {
			return configs, err
		}
	}
	return configs, nil
}
// The default template to use when serving up directory listings
const defaultTemplate = `
	
		{{.Name}}
		
	
	
		
			{{if .CanGoUp}}
			⬑
			{{else}}
			 
			{{end}}
			{{.Path}}
		
		
			
				
					| 
						{{if and (eq .Sort "name") (ne .Order "desc")}}
						Name ▲
						{{else if and (eq .Sort "name") (ne .Order "asc")}}
						Name ▼
						{{else}}
						Name
						{{end}}
					 | 
					
						{{if and (eq .Sort "size") (ne .Order "desc")}}
						Size ▲
						{{else if and (eq .Sort "size") (ne .Order "asc")}}
						Size ▼
						{{else}}
						Size
						{{end}}
					 | 
					
						{{if and (eq .Sort "time") (ne .Order "desc")}}
						Modified ▲
						{{else if and (eq .Sort "time") (ne .Order "asc")}}
						Modified ▼
						{{else}}
						Modified
						{{end}}
					 | 
				
				{{range .Items}}
				
					| 
						{{if .IsDir}}📂{{else}}📄{{end}}
						{{.Name}}
					 | 
					{{.HumanSize}} | 
					{{.HumanModTime "01/02/2006 3:04:05 PM -0700"}} | 
				
				{{end}}
			
		
	
`