package launch

import (
	"os"
	"path/filepath"
	"runtime"
	"slices"
	"strings"
	"testing"
)

func TestPoolsideArgs(t *testing.T) {
	p := &Poolside{}

	tests := []struct {
		name  string
		model string
		extra []string
		want  []string
	}{
		{name: "with model", model: "qwen3.5", want: []string{"-m", "qwen3.5"}},
		{name: "without model", extra: []string{"session"}, want: []string{"session"}},
		{name: "with model and extra args", model: "llama3.2", extra: []string{"--foo", "bar"}, want: []string{"-m", "llama3.2", "--foo", "bar"}},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := p.args(tt.model, tt.extra)
			if !slices.Equal(got, tt.want) {
				t.Fatalf("args(%q, %v) = %v, want %v", tt.model, tt.extra, got, tt.want)
			}
		})
	}
}

func TestPoolsideRunSetsOllamaEnv(t *testing.T) {
	if runtime.GOOS == "windows" {
		t.Skip("uses POSIX shell fake binary")
	}

	tmpDir := t.TempDir()
	logPath := filepath.Join(tmpDir, "pool.log")
	poolPath := filepath.Join(tmpDir, "pool")
	script := "#!/bin/sh\n" +
		"printf 'base=%s\\nkey=%s\\nargs=%s\\n' \"$POOLSIDE_STANDALONE_BASE_URL\" \"$POOLSIDE_API_KEY\" \"$*\" > \"" + logPath + "\"\n"
	if err := os.WriteFile(poolPath, []byte(script), 0o755); err != nil {
		t.Fatalf("failed to write fake pool binary: %v", err)
	}

	t.Setenv("PATH", tmpDir)
	t.Setenv("OLLAMA_HOST", "http://127.0.0.1:11434")

	p := &Poolside{}
	if err := p.Run("qwen3.5", nil, []string{"session"}); err != nil {
		t.Fatalf("Run returned error: %v", err)
	}

	data, err := os.ReadFile(logPath)
	if err != nil {
		t.Fatalf("failed to read pool log: %v", err)
	}

	got := string(data)
	if !strings.Contains(got, "base=http://127.0.0.1:11434/v1") {
		t.Fatalf("expected Poolside base URL override in log, got:\n%s", got)
	}
	if !strings.Contains(got, "key=ollama") {
		t.Fatalf("expected Poolside API key override in log, got:\n%s", got)
	}
	if !strings.Contains(got, "args=-m qwen3.5 session") {
		t.Fatalf("expected model and extra args in log, got:\n%s", got)
	}
}

func TestPoolsideRunWindowsUnsupported(t *testing.T) {
	prev := poolsideGOOS
	poolsideGOOS = "windows"
	t.Cleanup(func() { poolsideGOOS = prev })

	p := &Poolside{}
	err := p.Run("kimi-k2.6:cloud", nil, nil)
	if err == nil {
		t.Fatal("expected Windows unsupported error")
	}
	if !strings.Contains(err.Error(), "not currently supported on Windows") {
		t.Fatalf("expected Windows warning, got %v", err)
	}
}
