package cfg

import (
	"fmt"
	"path"
	"reflect"
	"strings"
	"time"

	"github.com/Masterminds/glide/util"
)

// lConfig1 is a legacy Config file.
type lConfig1 struct {
	Name        string         `yaml:"package"`
	Description string         `json:"description,omitempty"`
	Home        string         `yaml:"homepage,omitempty"`
	License     string         `yaml:"license,omitempty"`
	Owners      Owners         `yaml:"owners,omitempty"`
	Ignore      []string       `yaml:"ignore,omitempty"`
	Exclude     []string       `yaml:"excludeDirs,omitempty"`
	Imports     lDependencies1 `yaml:"import"`
	DevImports  lDependencies1 `yaml:"testImport,omitempty"`
}

func (c *lConfig1) UnmarshalYAML(unmarshal func(interface{}) error) error {
	newConfig := &lcf1{}
	if err := unmarshal(&newConfig); err != nil {
		return err
	}
	c.Name = newConfig.Name
	c.Description = newConfig.Description
	c.Home = newConfig.Home
	c.License = newConfig.License
	c.Owners = newConfig.Owners
	c.Ignore = newConfig.Ignore
	c.Exclude = newConfig.Exclude
	c.Imports = newConfig.Imports
	c.DevImports = newConfig.DevImports

	// Cleanup the Config object now that we have it.
	err := c.DeDupe()

	return err
}

func (c *lConfig1) Convert() (*Config, error) {
	// This is probably already done, but do it just in case
	err := c.DeDupe()
	if err != nil {
		return nil, err
	}

	// Pull over the easy values
	c2 := &Config{
		Name:        c.Name,
		Description: c.Description,
		Home:        c.Home,
		License:     c.License,
		Owners:      c.Owners,
		Ignore:      c.Ignore,
	}

	// _if_ the name is set, path-prepend it to exclude, and add that to ignore.
	// Otherwise, we just skip excludes. Not that big a deal, since they're a
	// root-only property anyway; the user can reasonably recreate.

	if c.Name != "" {
		for _, excl := range c.Exclude {
			c.Ignore = append(c.Ignore, path.Join(c.Name, excl))
			// The trailing * is interpreted by gps as an ignore on that and all
			// child paths (or, soon - https://github.com/sdboyer/gps/issues/88)
			c.Ignore = append(c.Ignore, path.Join(c.Name, excl, "*"))
		}
	}

	// Quitting early on this might seem risky, but a) all possible errs
	// _should_ have already been surfaced in the earlier DeDupe(), and b) there
	// are no new errs introduced by the conversion itself, so this doesn't
	// actually increase the surface area for failures vis-a-vis pre-gps glide.
	c2.Imports, err = c.Imports.Convert()
	if err != nil {
		return nil, err
	}
	c2.DevImports, err = c.DevImports.Convert()
	if err != nil {
		return nil, err
	}

	return c2, nil
}

// DeDupe consolidates duplicate dependencies on a Config instance
func (c *lConfig1) DeDupe() error {
	// Remove duplicates in the imports
	var err error
	c.Imports, err = c.Imports.DeDupe()
	if err != nil {
		return err
	}
	c.DevImports, err = c.DevImports.DeDupe()
	if err != nil {
		return err
	}

	// If the name on the config object is part of the imports remove it.
	found := -1
	for i, dep := range c.Imports {
		if dep.Name == c.Name {
			found = i
		}
	}
	if found >= 0 {
		c.Imports = append(c.Imports[:found], c.Imports[found+1:]...)
	}

	found = -1
	for i, dep := range c.DevImports {
		if dep.Name == c.Name {
			found = i
		}
	}
	if found >= 0 {
		c.DevImports = append(c.DevImports[:found], c.DevImports[found+1:]...)
	}

	// If something is on the ignore list remove it from the imports.
	for _, v := range c.Ignore {
		found = -1
		for k, d := range c.Imports {
			if v == d.Name {
				found = k
			}
		}
		if found >= 0 {
			c.Imports = append(c.Imports[:found], c.Imports[found+1:]...)
		}

		found = -1
		for k, d := range c.DevImports {
			if v == d.Name {
				found = k
			}
		}
		if found >= 0 {
			c.DevImports = append(c.DevImports[:found], c.DevImports[found+1:]...)
		}
	}

	return nil
}

// Legacy representation of a glide.yaml file.
type lcf1 struct {
	Name        string         `yaml:"package"`
	Description string         `yaml:"description,omitempty"`
	Home        string         `yaml:"homepage,omitempty"`
	License     string         `yaml:"license,omitempty"`
	Owners      Owners         `yaml:"owners,omitempty"`
	Ignore      []string       `yaml:"ignore,omitempty"`
	Exclude     []string       `yaml:"excludeDirs,omitempty"`
	Imports     lDependencies1 `yaml:"import"`
	DevImports  lDependencies1 `yaml:"testImport,omitempty"`
	// these fields guarantee that this struct fails to unmarshal the new yamls
	Compat  int `yaml:"dependencies,omitempty"`
	Compat2 int `yaml:"testDependencies,omitempty"`
}

type lDependencies1 []*lDependency1

func (ds lDependencies1) Convert() (Dependencies, error) {
	dds, err := ds.DeDupe()
	if err != nil {
		return nil, err
	}

	var ds2 Dependencies
	for _, d := range dds {
		// If we have neither a repo nor a reference, then it's pointless to
		// include this dep in the list (it will add no information to gps)
		if d.Repository == "" && d.Reference == "" {
			continue
		}

		d2 := &Dependency{
			Name:       d.Name,
			Repository: d.Repository,
		}

		d2.Constraint = DeduceConstraint(d.Reference)
		// TODO(sdboyer) if the above result is a plain version, the old
		// semantics are ambiguous wrt if the user wants a branch or tag. Check
		// the version list (via source manager) to convert most sanely?
		ds2 = append(ds2, d2)
	}

	return ds2, nil
}

// DeDupe cleans up duplicates on a list of dependencies.
func (d lDependencies1) DeDupe() (lDependencies1, error) {
	checked := map[string]int{}
	imports := make(lDependencies1, 0, 1)
	i := 0
	for _, dep := range d {
		// The first time we encounter a dependency add it to the list
		if val, ok := checked[dep.Name]; !ok {
			checked[dep.Name] = i
			imports = append(imports, dep)
			i++
		} else {
			// In here we've encountered a dependency for the second time.
			// Make sure the details are the same or return an error.
			v := imports[val]
			if dep.Reference != v.Reference {
				return d, fmt.Errorf("Import %s repeated with different versions '%s' and '%s'", dep.Name, dep.Reference, v.Reference)
			}
			if dep.Repository != v.Repository || dep.VcsType != v.VcsType {
				return d, fmt.Errorf("Import %s repeated with different Repository details", dep.Name)
			}
			if !reflect.DeepEqual(dep.Os, v.Os) || !reflect.DeepEqual(dep.Arch, v.Arch) {
				return d, fmt.Errorf("Import %s repeated with different OS or Architecture filtering", dep.Name)
			}
			imports[checked[dep.Name]].Subpackages = stringArrayDeDupe(v.Subpackages, dep.Subpackages...)
		}
	}

	return imports, nil
}

type lDependency1 struct {
	Name        string   `yaml:"package"`
	Reference   string   `yaml:"version,omitempty"`
	Pin         string   `yaml:"-"`
	Repository  string   `yaml:"repo,omitempty"`
	VcsType     string   `yaml:"vcs,omitempty"`
	Subpackages []string `yaml:"subpackages,omitempty"`
	Arch        []string `yaml:"arch,omitempty"`
	Os          []string `yaml:"os,omitempty"`
}

// Legacy unmarshaler for dependency component of yaml files
func (d *lDependency1) UnmarshalYAML(unmarshal func(interface{}) error) error {
	newDep := &ldep1{}
	err := unmarshal(newDep)
	if err != nil {
		return err
	}
	d.Name = newDep.Name
	d.Reference = newDep.Reference
	d.Repository = newDep.Repository
	d.VcsType = newDep.VcsType
	d.Subpackages = newDep.Subpackages
	d.Arch = newDep.Arch
	d.Os = newDep.Os

	if d.Reference == "" && newDep.Ref != "" {
		d.Reference = newDep.Ref
	}

	// Make sure only legitimate VCS are listed.
	d.VcsType = filterVcsType(d.VcsType)

	// Get the root name for the package
	tn, subpkg := util.NormalizeName(d.Name)
	d.Name = tn
	if subpkg != "" {
		d.Subpackages = append(d.Subpackages, subpkg)
	}

	// Older versions of Glide had a / prefix on subpackages in some cases.
	// Here that's cleaned up. Someday we should be able to remove this.
	for k, v := range d.Subpackages {
		d.Subpackages[k] = strings.TrimPrefix(v, "/")
	}

	return nil
}

// Legacy representation of a dep constraint
type ldep1 struct {
	Name        string   `yaml:"package"`
	Reference   string   `yaml:"version,omitempty"`
	Ref         string   `yaml:"ref,omitempty"`
	Repository  string   `yaml:"repo,omitempty"`
	VcsType     string   `yaml:"vcs,omitempty"`
	Subpackages []string `yaml:"subpackages,omitempty"`
	Arch        []string `yaml:"arch,omitempty"`
	Os          []string `yaml:"os,omitempty"`
}

type lLockfile1 struct {
	Hash       string    `yaml:"hash"`
	Updated    time.Time `yaml:"updated"`
	Imports    lLocks1   `yaml:"imports"`
	DevImports lLocks1   `yaml:"testImports"` // TODO remove and fold in as prop
	Compat     int       `yaml:"import,omitempty"`
	Compat2    int       `yaml:"testImport,omitempty"`
}

func (l *lLockfile1) Convert() *Lockfile {
	return &Lockfile{
		Hash:       l.Hash,
		Updated:    l.Updated,
		Imports:    l.Imports.Convert(),
		DevImports: l.DevImports.Convert(),
	}
}

type lLocks1 []*lLock1

func (ll lLocks1) Convert() Locks {
	var ll2 Locks
	for _, l := range ll {
		// If they have no rev, just drop them
		if l.Version == "" {
			continue
		}

		ll2 = append(ll2, &Lock{
			Name:       l.Name,
			Repository: l.Repository,
			Revision:   l.Version,
		})
	}

	return ll2
}

type lLock1 struct {
	Name        string   `yaml:"name"`
	Version     string   `yaml:"version"`
	Repository  string   `yaml:"repo,omitempty"`
	VcsType     string   `yaml:"vcs,omitempty"`
	Subpackages []string `yaml:"subpackages,omitempty"`
	Arch        []string `yaml:"arch,omitempty"`
	Os          []string `yaml:"os,omitempty"`
}
