package presets

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

func TestMemoryTemplateFilesAllLocales(t *testing.T) {
	required := []string{
		"MEMORY.md",
		"events/example-event.md",
		"knowledge/concepts/example-concept.md",
		"knowledge/workflows/example-workflow.md",
		"profiles/collaborators/example-collaborator.md",
		"profiles/user.md",
		"reflections/insights.md",
		"system/goals.md",
		"system/identity.md",
	}
	for _, locale := range []string{"en", "zh-CN", "ja", "zh-Hans", "ja-JP"} {
		t.Run(locale, func(t *testing.T) {
			files, err := MemoryTemplateFiles(locale)
			if err != nil {
				t.Fatal(err)
			}
			paths := make([]string, 0, len(files))
			for _, file := range files {
				paths = append(paths, file.Path)
				if len(file.Content) == 0 {
					t.Fatalf("template file %q is empty", file.Path)
				}
				if filepath.Base(file.Path) == "README.md" {
					t.Fatalf("template file %q must not be README.md", file.Path)
				}
			}
			if !reflect.DeepEqual(paths, required) {
				t.Fatalf("template paths = %v, want %v", paths, required)
			}
		})
	}
}

func TestMemoryLabelsLocalized(t *testing.T) {
	en := MemoryLabels("en-US")
	zh := MemoryLabels("zh-CN")
	ja := MemoryLabels("ja-JP")

	if len(en) != 10 || len(zh) != len(en) || len(ja) != len(en) {
		t.Fatalf("label lengths = en:%d zh:%d ja:%d", len(en), len(zh), len(ja))
	}
	wantNames := []struct {
		index        int
		english      string
		simplifiedCN string
		japanese     string
	}{
		{0, "knowledge", "知识", "ナレッジ"},
		{1, "insight", "洞察", "洞察"},
		{4, "collaborator", "协作者", "協力者"},
	}
	for _, want := range wantNames {
		if en[want.index].Name != want.english || zh[want.index].Name != want.simplifiedCN || ja[want.index].Name != want.japanese {
			t.Fatalf("label %d names = %q/%q/%q, want %q/%q/%q", want.index, en[want.index].Name, zh[want.index].Name, ja[want.index].Name, want.english, want.simplifiedCN, want.japanese)
		}
	}
	for _, label := range en {
		if label.Key == "" || label.Name == "" || label.Color == "" || label.Description == "" {
			t.Fatalf("label incomplete: %+v", label)
		}
	}
}

func TestMemoryInitialCommitMessageFallback(t *testing.T) {
	for _, test := range []struct{ got, want string }{
		{NormalizeLocale("zh-Hans-CN"), LocaleSimplifiedChinese},
		{NormalizeLocale("ja-JP"), LocaleJapanese},
		{NormalizeLocale("fr-FR"), LocaleEnglish},
		{MemoryInitialCommitMessage("zh-CN"), "初始化记忆仓库"},
		{MemoryInitialCommitMessage("en-US"), "Initialize memory repository"},
		{MemoryInitialCommitMessage("ja"), "メモリーリポジトリを初期化"},
		{MemoryInitialCommitMessage("unknown-locale"), "Initialize memory repository"},
	} {
		if test.got != test.want {
			t.Fatalf("got %q, want %q", test.got, test.want)
		}
	}
}
