// 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)
		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 {
	dir := path.Base(module)
	if versionSuffixRE.MatchString(dir) {
		dir = path.Base(path.Dir(module)) + "_" + dir
	}
	return filepath.Join(exported.temp, dir)
}
