package cfg

import (
	"testing"

	"github.com/sdboyer/gps"

	"gopkg.in/yaml.v2"
)

var lyml = `
package: fake/testing
description: foo bar baz
homepage: https://example.com
license: MIT
owners:
- name: foo
  email: bar@example.com
  homepage: https://example.com
import:
  - package: github.com/kylelemons/go-gypsy
    subpackages:
      - yaml
  # Intentionally left spaces at end of next line.
  - package: github.com/Masterminds/convert
    repo: git@github.com:Masterminds/convert.git
    vcs: git
    ref: a9949121a2e2192ca92fa6dddfeaaa4a4412d955
    subpackages:
      - color
      - nautical
      - radial
    os:
      - linux
    arch:
      - i386
      - arm
  - package: github.com/Masterminds/structable
    version: v1.0.0
  - package: github.com/Masterminds/cookoo/color
  - package: github.com/Masterminds/cookoo/convert

testImport:
  - package: github.com/kylelemons/go-gypsy
`

var yml = `
package: fake/testing
description: foo bar baz
homepage: https://example.com
license: MIT
owners:
- name: foo
  email: bar@example.com
  homepage: https://example.com
dependencies:
  - package: github.com/kylelemons/go-gypsy
    version: v1.0.0
  - package: github.com/Masterminds/convert
    repo: git@github.com:Masterminds/convert.git
    version: a9949121a2e2192ca92fa6dddfeaaa4a4412d955
  - package: github.com/Masterminds/structable
    branch: master
  - package: github.com/Masterminds/cookoo
    repo: git://github.com/Masterminds/cookoo
  - package: github.com/sdboyer/gps
    version: ^v1.0.0

testDependencies:
  - package: github.com/Sirupsen/logrus
    version: ~v1.0.0
`

func TestManualConfigFromYaml(t *testing.T) {
	cfg := &Config{}
	err := yaml.Unmarshal([]byte(yml), &cfg)
	if err != nil {
		t.Errorf("Unable to Unmarshal config yaml")
	}

	found := make(map[string]bool)
	for _, i := range cfg.Imports {
		found[i.Name] = true

		switch i.Name {
		case "github.com/kylelemons/go-gypsy":
			ref := "v1.0.0"
			if i.Version != ref {
				t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version)
			}

		case "github.com/Masterminds/convert":
			ref := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955"
			if i.Version != ref {
				t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version)
			}

			repo := "git@github.com:Masterminds/convert.git"
			if i.Repository != repo {
				t.Errorf("(%s) Expected %q for repository, got %q", i.Name, repo, i.Repository)
			}

		case "github.com/Masterminds/structable":
			ref := "master"
			if i.Branch != ref {
				t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Branch)
			}

		case "github.com/Masterminds/cookoo":
			repo := "git://github.com/Masterminds/cookoo"
			if i.Repository != repo {
				t.Errorf("(%s) Expected %q for repository, got %q", i.Name, repo, i.Repository)
			}

		case "github.com/sdboyer/gps":
			sv := "^v1.0.0"
			if i.Version != sv {
				t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, sv, i.Version)
			}
		}
	}

	names := []string{
		"github.com/Masterminds/convert",
		"github.com/Masterminds/cookoo",
		"github.com/Masterminds/structable",
		"github.com/kylelemons/go-gypsy",
		"github.com/sdboyer/gps",
	}

	for _, n := range names {
		if !found[n] {
			t.Errorf("Could not find config entry for %s", n)

		}
	}

	if len(cfg.DevImports) != 1 {
		t.Errorf("Expected 1 entry in DevImports, got %v", len(cfg.DevImports))
	} else {
		ti := cfg.DevImports[0]
		n := "github.com/Sirupsen/logrus"
		if ti.Name != n {
			t.Errorf("Expected test dependency to be %s, got %s", n, ti.Name)
		}

		sv := "~v1.0.0"
		if ti.Version != sv {
			t.Errorf("(%s) Expected %q for constraint, got %q", ti.Name, sv, ti.Version)
		}
	}

	if cfg.Name != "fake/testing" {
		t.Errorf("Inaccurate name found %s", cfg.Name)
	}

	if cfg.Description != "foo bar baz" {
		t.Errorf("Inaccurate description found %s", cfg.Description)
	}

	if cfg.Home != "https://example.com" {
		t.Errorf("Inaccurate homepage found %s", cfg.Home)
	}

	if cfg.License != "MIT" {
		t.Errorf("Inaccurate license found %s", cfg.License)
	}

}

func TestLegacyManualConfigFromYaml(t *testing.T) {
	cfg := &lConfig1{}
	err := yaml.Unmarshal([]byte(lyml), &cfg)
	if err != nil {
		t.Errorf("Unable to Unmarshal config yaml")
	}

	if cfg.Name != "fake/testing" {
		t.Errorf("Inaccurate name found %s", cfg.Name)
	}

	if cfg.Description != "foo bar baz" {
		t.Errorf("Inaccurate description found %s", cfg.Description)
	}

	if cfg.Home != "https://example.com" {
		t.Errorf("Inaccurate homepage found %s", cfg.Home)
	}

	if cfg.License != "MIT" {
		t.Errorf("Inaccurate license found %s", cfg.License)
	}

	found := false
	found2 := false
	for _, i := range cfg.Imports {
		if i.Name == "github.com/Masterminds/convert" {
			found = true
			ref := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955"
			if i.Reference != ref {
				t.Errorf("Config reference for cookoo is inaccurate. Expected '%s' found '%s'", ref, i.Reference)
			}
		}

		if i.Name == "github.com/Masterminds/cookoo" {
			found2 = true
			if i.Subpackages[0] != "color" {
				t.Error("Dependency separating package and subpackage not working")
			}
		}
	}
	if !found {
		t.Error("Unable to find github.com/Masterminds/convert")
	}
	if !found2 {
		t.Error("Unable to find github.com/Masterminds/cookoo")
	}
}

func TestClone(t *testing.T) {
	cfg := &Config{}
	err := yaml.Unmarshal([]byte(yml), &cfg)
	if err != nil {
		t.Errorf("Unable to Unmarshal config yaml")
	}

	cfg2 := cfg.Clone()
	if cfg2.Name != "fake/testing" {
		t.Error("Config cloning failed")
	}
	if cfg2.License != "MIT" {
		t.Error("Config cloning failed to copy License")
	}
	cfg.Name = "foo"

	if cfg.Name == cfg2.Name {
		t.Error("Cloning Config name failed")
	}
}

func TestLegacyConfigAutoconvert(t *testing.T) {
	c, leg, err := ConfigFromYaml([]byte(lyml))
	if err != nil {
		t.Errorf("ConfigFromYaml failed to detect and autoconvert legacy yaml file with err %s", err)
	}

	if !leg {
		t.Errorf("ConfigFromYaml failed to report autoconversion of legacy yaml file")
	}

	if c.Name != "fake/testing" {
		t.Error("ConfigFromYaml failed to properly autoconvert legacy yaml file")
	}

	// Two should survive the conversion
	if len(c.Imports) != 2 {
		t.Error("Expected two dep clauses to survive conversion, but got ", len(c.Imports))
	}

	found := false
	found2 := false
	for _, i := range c.Imports {
		if i.Name == "github.com/Masterminds/convert" {
			found = true
			ref := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955"
			if i.Version != ref {
				t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version)
			}

			repo := "git@github.com:Masterminds/convert.git"
			if i.Repository != repo {
				t.Errorf("(%s) Expected %q for repository, got %q", i.Name, repo, i.Repository)
			}
		}

		if i.Name == "github.com/Masterminds/structable" {
			found2 = true
			ref := "v1.0.0"
			if i.Version != ref {
				t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version)
			}
		}
	}

	if !found {
		t.Error("Unable to find github.com/Masterminds/convert")
	}
	if !found2 {
		t.Error("Unable to find github.com/Masterminds/structable")
	}
}

func TestConfigFromYaml(t *testing.T) {
	c, _, err := ConfigFromYaml([]byte(yml))
	if err != nil {
		t.Error("ConfigFromYaml failed to parse yaml")
	}

	if c.Name != "fake/testing" {
		t.Error("ConfigFromYaml failed to properly parse yaml")
	}
}

func TestHasDependency(t *testing.T) {
	c, _, err := ConfigFromYaml([]byte(yml))
	if err != nil {
		t.Error("ConfigFromYaml failed to parse yaml for HasDependency")
	}

	if !c.HasDependency("github.com/Masterminds/convert") {
		t.Error("HasDependency failing to pickup depenency")
	}

	if c.HasDependency("foo/bar/bar") != false {
		t.Error("HasDependency picking up dependency it shouldn't")
	}
}

func TestOwners(t *testing.T) {
	o := new(Owner)
	o.Name = "foo"
	o.Email = "foo@example.com"
	o.Home = "https://foo.example.com"

	o2 := o.Clone()
	if o2.Name != o.Name || o2.Email != o.Email || o2.Home != o.Home {
		t.Error("Unable to clone Owner")
	}

	o.Name = "Bar"
	if o.Name == o2.Name {
		t.Error("Owner clone is a pointer instead of a clone")
	}

	s := make(Owners, 0, 1)
	s = append(s, o)
	s2 := s.Clone()
	o3 := s2[0]

	o3.Name = "Qux"

	if o3.Name == o.Name {
		t.Error("Owners cloning isn't deep")
	}

	cfg := &Config{}
	err := yaml.Unmarshal([]byte(yml), &cfg)
	if err != nil {
		t.Errorf("Unable to Unmarshal config yaml")
	}

	if cfg.Owners[0].Name != "foo" ||
		cfg.Owners[0].Email != "bar@example.com" ||
		cfg.Owners[0].Home != "https://example.com" {
		t.Error("Unable to parse owners from yaml")
	}
}

func TestDeduceConstraint(t *testing.T) {
	// First, valid semver
	c := DeduceConstraint("v1.0.0")
	if c.(gps.Version).Type() != "semver" {
		t.Errorf("Got unexpected version type when passing valid semver string: %T %s", c, c)
	}

	// Now, 20 hex-encoded bytes (which should be assumed to be a SHA1 digest)
	revin := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955"
	c = DeduceConstraint(revin)
	if c != gps.Revision(revin) {
		t.Errorf("Got unexpected version type/val when passing hex-encoded SHA1 digest: %T %s", c, c)
	}

	// Now, the weird bzr guid
	bzrguid := "john@smith.org-20051026185030-93c7cad63ee570df"
	c = DeduceConstraint(bzrguid)
	if c != gps.Revision(bzrguid) {
		t.Errorf("Expected revision with valid bzr guid, got: %T %s", c, c)
	}

	// Check fails if the bzr rev is malformed or weirdly formed
	//
	// chopping off a char should make the hex decode check fail
	c = DeduceConstraint(bzrguid[:len(bzrguid)-1])
	if c != gps.NewVersion(bzrguid[:len(bzrguid)-1]) {
		t.Errorf("Expected plain version when bzr guid has truncated tail hex bits: %T %s", c, c)
	}

	// Extra dash in email doesn't mess us up
	bzrguid2 := "john-smith@smith.org-20051026185030-93c7cad63ee570df"
	c = DeduceConstraint(bzrguid2)
	if c != gps.Revision(bzrguid2) {
		t.Errorf("Expected revision when passing bzr guid has extra dash in email, got: %T %s", c, c)
	}

	// Non-numeric char in middle section bites it
	bzrguid3 := "john-smith@smith.org-2005102a6185030-93c7cad63ee570df"
	c = DeduceConstraint(bzrguid3)
	if c != gps.NewVersion(bzrguid3) {
		t.Errorf("Expected plain version when bzr guid has invalid second section, got: %T %s", c, c)
	}
}
