package manager

import (
	"errors"
	"testing"
)

// TestIsUnknownSessionErr 覆盖「agent 侧会话失效」判定的已知措辞与反例。
//
// 回归背景（grok）：grok（x.ai）的失效错误是
//
//	prompt: {"code":-32602,"message":"Invalid params","data":"unknown session id"}
//
// 措辞里不带 session id 本身，而早期实现要求「session 与 uuid/hex 前缀共现」，
// 于是 grok 永远命中不了自动恢复分支：空闲回收（idle_timeout）杀掉 agent 后，
// 用户隔一段时间回来发消息会直接看到
// `出错了: prompt: {"code":-32602,...,"data":"unknown session id"}`，
// 而不是静默 session/load 恢复上下文。
func TestIsUnknownSessionErr(t *testing.T) {
	cases := []struct {
		name string
		err  error
		want bool
	}{
		// grok：不带 session id 的失效措辞（本次修复点）
		{
			name: "grok unknown session id",
			err:  errors.New(`prompt: {"code":-32602,"message":"Invalid params","data":"unknown session id"}`),
			want: true,
		},
		// 既有 agent 措辞（带 id，回归保护）
		{
			name: "omp unsupported acp session",
			err:  errors.New(`{"code":-32603,"message":"Internal error","details":"Unsupported ACP session: 019fd945-ff8c-7abc-8def-0123456789ab"}`),
			want: true,
		},
		{
			name: "reasonix unknown session",
			err:  errors.New(`session/019fd945-ff8c-7abc-8def-0123456789ab: unknown session 019fd945-ff8c-7abc-8def-0123456789ab`),
			want: true,
		},
		{
			name: "session not found",
			err:  errors.New(`Session not found: 019fd945ff8c7abc`),
			want: true,
		},
		// 反例：参数/配置类错误不得误判（误判会 RecoverSession 重建会话、静默丢上下文）
		{
			name: "unknown session config option (no id)",
			err:  errors.New(`prompt: {"code":-32602,"message":"Invalid params","data":"unknown session config option: foo"}`),
			want: false,
		},
		{
			name: "invalid session config option (with id)",
			err:  errors.New(`invalid session config option: 019fd945-ff8c-7abc-8def-0123456789ab`),
			want: false,
		},
		{
			name: "unrelated file error",
			err:  errors.New(`write /workspace/session.json: no such file or directory`),
			want: false,
		},
		{name: "nil", err: nil, want: false},
	}
	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			if got := IsUnknownSessionErr(c.err); got != c.want {
				t.Fatalf("IsUnknownSessionErr(%v) = %v, want %v", c.err, got, c.want)
			}
		})
	}
}
