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

func init() {
	register(httpHeadersFix)
}

var httpHeadersFix = fix{
	"httpheaders",
	"2011-06-16",
	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{},
	},
}
