// Copyright 2017 The Fuchsia 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 main

import (
	"os"
	"strconv"
	"testing"

	"fuchsia.googlesource.com/jiri/jiritest"
	"fuchsia.googlesource.com/jiri/project"
)

func setDefaultConfigFlags() {
	configIgnoreFlag = ""
	configNoUpdateFlag = ""
	configNoRebaseFlag = ""
}

func testConfig(t *testing.T, fake *jiritest.FakeJiriRoot, localProjects []project.Project) {
	p, err := project.ProjectAtPath(fake.X, localProjects[1].Path)
	if err != nil {
		t.Fatal(err)
	}
	oldConfig := p.LocalConfig
	if err := runProjectConfig(fake.X, []string{}); err != nil {
		t.Fatal(err)
	}
	if p, err = project.ProjectAtPath(fake.X, localProjects[1].Path); err != nil {
		t.Fatal(err)
	}
	newConfig := p.LocalConfig

	expectedOutput := oldConfig.Ignore
	if configIgnoreFlag != "" {
		if expectedOutput, err = strconv.ParseBool(configIgnoreFlag); err != nil {
			t.Fatal(err)
		}
	}
	if newConfig.Ignore != expectedOutput {
		t.Errorf("local config ignore: got %t, want %t", newConfig.Ignore, expectedOutput)
	}

	expectedOutput = oldConfig.NoUpdate
	if configNoUpdateFlag != "" {
		if expectedOutput, err = strconv.ParseBool(configNoUpdateFlag); err != nil {
			t.Fatal(err)
		}
	}
	if newConfig.NoUpdate != expectedOutput {
		t.Errorf("local config no-update: got %t, want %t", newConfig.NoUpdate, expectedOutput)
	}

	expectedOutput = oldConfig.NoRebase
	if configNoRebaseFlag != "" {
		if expectedOutput, err = strconv.ParseBool(configNoRebaseFlag); err != nil {
			t.Fatal(err)
		}
	}
	if newConfig.NoRebase != expectedOutput {
		t.Errorf("local config no-rebase: got %t, want %t", newConfig.NoRebase, expectedOutput)
	}
}

func TestConfig(t *testing.T) {
	localProjects, fake, cleanup := setupUniverse(t)
	if err := fake.UpdateUniverse(false); err != nil {
		t.Fatal(err)
	}
	defer cleanup()
	currentDir, err := os.Getwd()
	if err != nil {
		t.Fatal(err)
	}
	defer func() {
		if err := os.Chdir(currentDir); err != nil {
			t.Fatal(err)
		}
	}()
	if err := os.Chdir(localProjects[1].Path); err != nil {
		t.Fatal(err)
	}

	setDefaultConfigFlags()
	configIgnoreFlag = "true"
	testConfig(t, fake, localProjects)

	setDefaultConfigFlags()
	configNoUpdateFlag = "true"
	configNoRebaseFlag = "true"
	testConfig(t, fake, localProjects)

	setDefaultConfigFlags()
	testConfig(t, fake, localProjects)

	setDefaultConfigFlags()
	configNoRebaseFlag = "false"
	configIgnoreFlag = "true"
	testConfig(t, fake, localProjects)

	setDefaultConfigFlags()
	configNoRebaseFlag = "false"
	configNoUpdateFlag = "false"
	testConfig(t, fake, localProjects)

	setDefaultConfigFlags()
	configNoRebaseFlag = "false"
	configNoUpdateFlag = "false"
	configIgnoreFlag = "false"
	testConfig(t, fake, localProjects)
}
