package agent

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

func TestReadWriteDoc(t *testing.T) {
	dir := t.TempDir()
	if err := WriteDoc(dir, DocKindIdentity, "I am the agent."); err != nil {
		t.Fatalf("WriteDoc: %v", err)
	}
	got, err := ReadDoc(dir, DocKindIdentity)
	if err != nil {
		t.Fatalf("ReadDoc: %v", err)
	}
	if got != "I am the agent." {
		t.Fatalf("ReadDoc returned %q", got)
	}
}

func TestReadWriteDoc_UsesCloudMemoryIdentityWithoutIndex(t *testing.T) {
	dir := t.TempDir()
	got, err := ReadDoc(dir, DocKindIdentity)
	if err != nil {
		t.Fatalf("ReadDoc(missing): %v", err)
	}
	if got != "" {
		t.Fatalf("ReadDoc(missing) = %q, want empty", got)
	}

	if err := WriteDoc(dir, DocKindIdentity, "remote identity"); err != nil {
		t.Fatalf("WriteDoc(remote): %v", err)
	}
	remotePath := filepath.Join(dir, "memory", "system", "identity.md")
	remote, err := os.ReadFile(remotePath)
	if err != nil {
		t.Fatalf("read remote identity: %v", err)
	}
	if string(remote) != "remote identity" {
		t.Fatalf("remote identity = %q", string(remote))
	}
	got, err = ReadDoc(dir, DocKindIdentity)
	if err != nil {
		t.Fatalf("ReadDoc(remote): %v", err)
	}
	if got != "remote identity" {
		t.Fatalf("ReadDoc(remote) = %q, want remote identity", got)
	}
	if _, err := os.Stat(filepath.Join(dir, "IDENTITY.md")); !os.IsNotExist(err) {
		t.Fatalf("root identity exists after write: %v", err)
	}
}

func TestReadDoc_MissingFile(t *testing.T) {
	dir := t.TempDir()
	got, err := ReadDoc(dir, DocKindIdentity)
	if err != nil {
		t.Fatalf("ReadDoc(missing): %v", err)
	}
	if got != "" {
		t.Fatalf("ReadDoc(missing) = %q, want empty", got)
	}
}

func TestParseDocKind(t *testing.T) {
	if _, err := ParseDocKind("identity"); err != nil {
		t.Errorf("ParseDocKind(identity): %v", err)
	}
	if _, err := ParseDocKind("bogus"); err == nil {
		t.Errorf("ParseDocKind(bogus) should error")
	}
}
