// Copyright 2020 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 (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"testing"

	"go.fuchsia.dev/jiri/jiritest"
	"go.fuchsia.dev/jiri/project"
)

func TestProjectIgnoresByAttribute(t *testing.T) {
	fake, cleanup := jiritest.NewFakeJiriRoot(t)
	defer cleanup()

	// Set up projects and packages with explict attributes
	numProjects := 3
	numOptionalProjects := 2
	localProjects := []project.Project{}
	totalProjects := numProjects + numOptionalProjects
	// Project info returns the manifest project info as well.
	numManifestProjects := 1

	createRemoteProj := func(i int, attributes string) {
		name := projectName(i)
		path := fmt.Sprintf("path-%d", i)
		if err := fake.CreateRemoteProject(name); err != nil {
			t.Fatalf("failed to create remote project due to error: %v", err)
		}
		p := project.Project{
			Name:       name,
			Path:       filepath.Join(fake.X.Root, path),
			Remote:     fake.Projects[name],
			Attributes: attributes,
		}
		localProjects = append(localProjects, p)
		if err := fake.AddProject(p); err != nil {
			t.Fatalf("failed to add a project to manifest due to error: %v", err)
		}
	}

	for i := 0; i < numProjects; i++ {
		createRemoteProj(i, "")
	}

	for i := numProjects; i < totalProjects; i++ {
		createRemoteProj(i, "optional")
	}

	// Create initial commit in each repo.
	for _, remoteProjectDir := range fake.Projects {
		writeReadme(t, fake.X, remoteProjectDir, "initial readme")
	}

	// Try default mode
	fake.X.FetchingAttrs = ""
	fake.UpdateUniverse(true)

	file, err := os.CreateTemp("", "tmp")
	if err != nil {
		t.Fatal(err)
	}
	defer os.Remove(file.Name())

	jsonOutputFlag = file.Name()
	useRemoteProjects = true

	err = runProject(fake.X, []string{})
	if err != nil {
		t.Fatal(err)
	}
	file.Close()

	var projectInfo []projectInfoOutput
	bytes, err := os.ReadFile(file.Name())
	if err != nil {
		t.Fatal(err)
	}
	err = json.Unmarshal(bytes, &projectInfo)
	if err != nil {
		t.Fatal(err)
	}

	expectedProjects := numProjects + numManifestProjects

	if len(projectInfo) != expectedProjects {
		t.Errorf("Unexpected number of projects returned (%d, %d) (want, got)\n%v", expectedProjects, len(projectInfo), projectInfo)
	}

	// Try attributes
	fake.X.FetchingAttrs = "optional"
	fake.UpdateUniverse(true)

	file2, err := os.CreateTemp("", "tmp")
	if err != nil {
		t.Fatal(err)
	}
	defer os.Remove(file2.Name())

	jsonOutputFlag = file2.Name()

	err = runProject(fake.X, []string{})
	if err != nil {
		t.Fatal(err)
	}
	file2.Close()

	bytes, err = os.ReadFile(file2.Name())
	if err != nil {
		t.Fatal(err)
	}
	err = json.Unmarshal(bytes, &projectInfo)
	if err != nil {
		t.Fatal(err)
	}

	expectedProjects = totalProjects + numManifestProjects

	if len(projectInfo) != expectedProjects {
		t.Errorf("Unexpected number of projects returned (%d, %d) (want, got)\n%v", expectedProjects, len(projectInfo), projectInfo)
	}
}
