// Copyright 2018 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 packagestest

import (
	"path"
	"path/filepath"
)

// GOPATH is the exporter that produces GOPATH layouts.
// Each "module" is put in it's own GOPATH entry to help test complex cases.
// Given the two files
//     golang.org/repoa#a/a.go
//     golang.org/repob#b/b.go
// You would get the directory layout
//     /sometemporarydirectory
//     ├── repoa
//     │   └── src
//     │       └── golang.org
//     │           └── repoa
//     │               └── a
//     │                   └── a.go
//     └── repob
//         └── src
//             └── golang.org
//                 └── repob
//                     └── b
//     										└── b.go
// GOPATH would be set to
//     /sometemporarydirectory/repoa;/sometemporarydirectory/repob
// and the working directory would be
//     /sometemporarydirectory/repoa/src
var GOPATH = gopath{}

func init() {
	All = append(All, GOPATH)
}

type gopath struct{}

func (gopath) Name() string {
	return "GOPATH"
}

func (gopath) Filename(exported *Exported, module, fragment string) string {
	return filepath.Join(gopathDir(exported, module), "src", module, fragment)
}

func (gopath) Finalize(exported *Exported) error {
	exported.Config.Env = append(exported.Config.Env, "GO111MODULE=off")
	gopath := ""
	for module := range exported.written {
		if gopath != "" {
			gopath += string(filepath.ListSeparator)
		}
		dir := gopathDir(exported, module)
		if module == gorootModule {
			exported.Config.Env = append(exported.Config.Env, "GOROOT="+dir)
			continue
		}
		gopath += dir
		if module == exported.primary {
			exported.Config.Dir = filepath.Join(dir, "src")
		}
	}
	exported.Config.Env = append(exported.Config.Env, "GOPATH="+gopath)
	return nil
}

func gopathDir(exported *Exported, module string) string {
	return filepath.Join(exported.temp, path.Base(module))
}
