// Copyright 2026 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 integrationtests

import (
	"os"
	"path/filepath"
	"strings"
	"testing"

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

func TestPackageCacheToggle(t *testing.T) {
	t.Parallel()

	remoteDir := t.TempDir()
	setupGitRepo(t, remoteDir, map[string]any{
		"manifest": project.Manifest{
			Packages: []project.Package{
				{
					Name:    "gn/gn/${platform}",
					Path:    "prebuilt/third_party/gn",
					Version: "git_revision:bdb0fd02324b120cacde634a9235405061c8ea06",
				},
			},
		},
	})

	root := t.TempDir()
	jiriRun := jiriInit(t, root, "-enable-lockfile=false")
	jiriRun("import", "manifest", remoteDir)

	// 1. Update with cache disabled (default)
	jiriRun("update")

	resolvedPath := "prebuilt/third_party/gn"
	destDir := filepath.Join(root, resolvedPath)

	// Verify it is a directory, not a symlink
	fi, err := os.Lstat(destDir)
	if err != nil {
		t.Fatal(err)
	}
	if fi.Mode()&os.ModeSymlink != 0 {
		t.Fatalf("Expected directory, got symlink at %s", destDir)
	}

	// Create a marker file
	markerFile := filepath.Join(destDir, "test_marker")
	markerContent := "preserved_content_integration"
	if err := os.WriteFile(markerFile, []byte(markerContent), 0644); err != nil {
		t.Fatal(err)
	}

	// 2. Opt-in: Enable cache (preserve lockfile=false)
	jiriRun("init", "-package-cache=true")

	jiriRun("update")

	// Verify destDir is now a symlink
	fi, err = os.Lstat(destDir)
	if err != nil {
		t.Fatal(err)
	}
	if fi.Mode()&os.ModeSymlink == 0 {
		t.Fatalf("Expected symlink, got directory at %s", destDir)
	}

	// Verify symlink points to cache
	linkTarget, err := os.Readlink(destDir)
	if err != nil {
		t.Fatal(err)
	}
	expectedCachePrefix := filepath.Join(root, jiri.RootMetaDir, "packages")
	if !strings.HasPrefix(linkTarget, expectedCachePrefix) {
		t.Errorf("Expected symlink to point to cache %s, got %s", expectedCachePrefix, linkTarget)
	}

	// Verify marker file is still there
	markerInDest := filepath.Join(destDir, "test_marker")
	gotContent, err := os.ReadFile(markerInDest)
	if err != nil {
		t.Fatalf("Marker file lost during opt-in: %v", err)
	}
	if string(gotContent) != markerContent {
		t.Errorf("Marker content mismatch: got %q, want %q", string(gotContent), markerContent)
	}

	// 3. Opt-out: Disable cache (preserve lockfile=false)
	jiriRun("init", "-package-cache=false")

	jiriRun("update")

	// Verify destDir is a directory again
	fi, err = os.Lstat(destDir)
	if err != nil {
		t.Fatal(err)
	}
	if fi.Mode()&os.ModeSymlink != 0 {
		t.Fatalf("Expected directory, got symlink at %s after opt-out", destDir)
	}

	// Verify marker file is still there
	gotContent, err = os.ReadFile(markerFile)
	if err != nil {
		t.Fatalf("Marker file lost during opt-out: %v", err)
	}
	if string(gotContent) != markerContent {
		t.Errorf("Marker content mismatch after opt-out: got %q, want %q", string(gotContent), markerContent)
	}
}
