package gb

import (
	"encoding/json"
	"os"
	"path/filepath"

	"github.com/Masterminds/glide/cfg"
	"github.com/Masterminds/glide/msg"
	gpath "github.com/Masterminds/glide/path"
	"github.com/Masterminds/glide/util"
)

// Has returns true if this dir has a GB-flavored manifest file.
func Has(dir string) bool {
	path := filepath.Join(dir, "vendor/manifest")
	fi, err := os.Stat(path)
	return err == nil && !fi.IsDir()
}

// Parse parses a GB-flavored manifest file.
func Parse(dir string) ([]*cfg.Dependency, error) {
	path := filepath.Join(dir, "vendor/manifest")
	if fi, err := os.Stat(path); err != nil || fi.IsDir() {
		return []*cfg.Dependency{}, nil
	}

	msg.Info("Found GB manifest file in %s", gpath.StripBasepath(dir))
	msg.Info("--> Parsing GB metadata...")
	buf := []*cfg.Dependency{}
	file, err := os.Open(path)
	if err != nil {
		return buf, err
	}
	defer file.Close()

	man := Manifest{}

	dec := json.NewDecoder(file)
	if err := dec.Decode(&man); err != nil {
		return buf, err
	}

	seen := map[string]bool{}

	for _, d := range man.Dependencies {
		// TODO(sdboyer) move to the corresponding SourceManager call...though
		// that matters less once gps caches these results
		pkg, _ := util.NormalizeName(d.Importpath)
		if !seen[pkg] {
			seen[pkg] = true
			dep := &cfg.Dependency{
				Name:       pkg,
				Version:    d.Revision,
				Repository: d.Repository,
			}
			buf = append(buf, dep)
		}
	}
	return buf, nil
}

// AsMetadataPair attempts to extract manifest and lock data from gb metadata.
func AsMetadataPair(dir string) (m []*cfg.Dependency, l *cfg.Lockfile, err error) {
	path := filepath.Join(dir, "vendor/manifest")
	if _, err = os.Stat(path); err != nil {
		return
	}

	file, err := os.Open(path)
	if err != nil {
		return
	}
	defer file.Close()

	man := Manifest{}

	dec := json.NewDecoder(file)
	if err = dec.Decode(&man); err != nil {
		return
	}

	seen := map[string]bool{}

	for _, d := range man.Dependencies {
		pkg, _ := util.NormalizeName(d.Importpath)
		if !seen[pkg] {
			seen[pkg] = true
			dep := &cfg.Dependency{
				Name:       pkg,
				Repository: d.Repository,
			}
			m = append(m, dep)
			l.Imports = append(l.Imports, &cfg.Lock{Name: pkg, Revision: d.Revision})
		}
	}
	return
}
