package scripts

import (
	"bytes"
	"os"
	"os/exec"
	"path/filepath"
	"testing"
)

func TestResolveOpenCodeVersionUsesExplicitVersionWithoutCurl(t *testing.T) {
	script := filepath.Join(desktopRootDir(t), "scripts", "resolve-opencode-version.sh")
	cmd := exec.Command("bash", script)
	cmd.Env = append(os.Environ(),
		"AGENTTEAM_MANAGED_OPENCODE_VERSION=9.8.7",
		"PATH="+t.TempDir(),
	)

	output, err := cmd.CombinedOutput()
	if err != nil {
		t.Fatalf("resolve explicit OpenCode version: %v, output=%s", err, output)
	}
	if got := string(bytes.TrimSpace(output)); got != "9.8.7" {
		t.Fatalf("resolved version=%q, want 9.8.7", got)
	}
}

func TestResolveOpenCodeVersionUsesLatestReleaseRedirect(t *testing.T) {
	binDir := t.TempDir()
	fakeCurl := filepath.Join(binDir, "curl")
	if err := os.WriteFile(fakeCurl, []byte("#!/bin/sh\nprintf '%s\\n' 'https://github.com/anomalyco/opencode/releases/tag/v1.18.5'\n"), 0o755); err != nil {
		t.Fatalf("write fake curl: %v", err)
	}

	script := filepath.Join(desktopRootDir(t), "scripts", "resolve-opencode-version.sh")
	cmd := exec.Command("bash", script)
	cmd.Env = append(os.Environ(),
		"AGENTTEAM_MANAGED_OPENCODE_VERSION=",
		"PATH="+binDir,
	)

	output, err := cmd.CombinedOutput()
	if err != nil {
		t.Fatalf("resolve latest OpenCode version: %v, output=%s", err, output)
	}
	if got := string(bytes.TrimSpace(output)); got != "1.18.5" {
		t.Fatalf("resolved version=%q, want 1.18.5", got)
	}
}

func TestResolveOpenCodeVersionRejectsMalformedRedirect(t *testing.T) {
	binDir := t.TempDir()
	fakeCurl := filepath.Join(binDir, "curl")
	if err := os.WriteFile(fakeCurl, []byte("#!/bin/sh\nprintf '%s\\n' 'https://github.com/anomalyco/opencode/releases/latest'\n"), 0o755); err != nil {
		t.Fatalf("write fake curl: %v", err)
	}

	script := filepath.Join(desktopRootDir(t), "scripts", "resolve-opencode-version.sh")
	cmd := exec.Command("bash", script)
	cmd.Env = append(os.Environ(),
		"AGENTTEAM_MANAGED_OPENCODE_VERSION=",
		"PATH="+binDir,
	)

	output, err := cmd.CombinedOutput()
	if err == nil {
		t.Fatalf("expected malformed redirect to fail, output=%s", output)
	}
	if !bytes.Contains(output, []byte("Unable to resolve the latest OpenCode version")) {
		t.Fatalf("unexpected failure output=%s", output)
	}
}
