// 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"
)

var httpHeadersFix = fix{
	"httpheaders",
	httpheaders,
	`Rename http Referer, UserAgent, Cookie, SetCookie, which are now methods.

http://codereview.appspot.com/4620049/
`,
}

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

	called := make(map[ast.Node]bool)
	walk(f, func(ni interface{}) {
		switch n := ni.(type) {
		case *ast.CallExpr:
			called[n.Fun] = true
		}
	})

	fixed := false
	typeof := typecheck(headerTypeConfig, f)
	walk(f, func(ni interface{}) {
		switch n := ni.(type) {
		case *ast.SelectorExpr:
			if called[n] {
				break
			}
			if t := typeof[n.X]; t != "*http.Request" && t != "*http.Response" {
				break
			}
			switch n.Sel.Name {
			case "Referer", "UserAgent":
				n.Sel.Name += "()"
				fixed = true
			case "Cookie":
				n.Sel.Name = "Cookies()"
				fixed = true
			}
		}
	})
	return fixed
}

var headerTypeConfig = &TypeConfig{
	Type: map[string]*Type{
		"*http.Request":  &Type{},
		"*http.Response": &Type{},
	},
}
