// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"go/ast"
	"go/token"
)

func init() {
	register(httpFileSystemFix)
}

var httpFileSystemFix = fix{
	"httpfs",
	"2011-06-27",
	httpfs,
	`Adapt http FileServer to take a FileSystem.

http://codereview.appspot.com/4629047  http FileSystem interface
`,
}

func httpfs(f *ast.File) bool {
	if !imports(f, "http") {
		return false
	}

	fixed := false
	walk(f, func(n interface{}) {
		call, ok := n.(*ast.CallExpr)
		if !ok || !isPkgDot(call.Fun, "http", "FileServer") {
			return
		}
		if len(call.Args) != 2 {
			return
		}
		dir, prefix := call.Args[0], call.Args[1]
		call.Args = []ast.Expr{&ast.CallExpr{
			Fun: &ast.SelectorExpr{
				X:   ast.NewIdent("http"),
				Sel: ast.NewIdent("Dir"),
			},
			Args: []ast.Expr{dir},
		}}
		wrapInStripHandler := true
		if prefixLit, ok := prefix.(*ast.BasicLit); ok {
			if prefixLit.Kind == token.STRING && (prefixLit.Value == `"/"` || prefixLit.Value == `""`) {
				wrapInStripHandler = false
			}
		}
		if wrapInStripHandler {
			call.Fun.(*ast.SelectorExpr).Sel = ast.NewIdent("StripPrefix")
			call.Args = []ast.Expr{
				prefix,
				&ast.CallExpr{
					Fun: &ast.SelectorExpr{
						X:   ast.NewIdent("http"),
						Sel: ast.NewIdent("FileServer"),
					},
					Args: call.Args,
				},
			}
		}
		fixed = true
	})
	return fixed
}
