package main

import "testing"

func TestPickBotNameAvoidsUsedWhenPossible(t *testing.T) {
	used := map[string]bool{}
	for _, n := range botNamePool[:len(botNamePool)-1] { // все, кроме одного
		used[n] = true
	}
	name := pickBotName(used)
	if used[name] {
		t.Errorf("ожидалось единственное свободное имя из пула, получено уже занятое: %q", name)
	}
}

func TestPickBotNameFallsBackWhenPoolExhausted(t *testing.T) {
	used := map[string]bool{}
	for _, n := range botNamePool {
		used[n] = true
	}
	name := pickBotName(used) // пул исчерпан — допустим повтор
	found := false
	for _, n := range botNamePool {
		if n == name {
			found = true
			break
		}
	}
	if !found {
		t.Errorf("даже при исчерпанном пуле имя должно быть из botNamePool, получено %q", name)
	}
}

func TestNewBotRosterDistinctNames(t *testing.T) {
	names, strategies := newBotRoster(3)
	if len(names) != 3 || len(strategies) != 3 {
		t.Fatalf("ожидалось 3 имени и 3 стратегии, получено %d и %d", len(names), len(strategies))
	}
	seen := map[string]bool{}
	for _, n := range names {
		if seen[n] {
			t.Errorf("имена ботов не должны повторяться при наличии свободных: %v", names)
		}
		seen[n] = true
	}
}

func TestNewModelAssignsNamesFromPool(t *testing.T) {
	m := NewModel()
	pool := map[string]bool{}
	for _, n := range botNamePool {
		pool[n] = true
	}
	for i, p := range m.game.Players {
		if i == m.humanIdx {
			continue
		}
		if !pool[p.Name] {
			t.Errorf("имя бота на месте %d (%q) должно быть из пула botNamePool", i, p.Name)
		}
	}
}

func TestBankruptcyMessageDoesNotRevealLevel(t *testing.T) {
	m := NewModel()
	m.game.Players[1].Balance = 0
	msg := m.checkBankruptcies()
	if msg == "" {
		t.Fatalf("ожидалось сообщение о банкротстве")
	}
	for _, lvl := range botLevels {
		if strings_Contains(msg, lvl.Suffix) {
			t.Errorf("сообщение о банкротстве не должно упоминать уровень сложности (%q найдено в %q)", lvl.Suffix, msg)
		}
	}
}

// strings_Contains — маленький локальный хелпер, чтобы не тянуть
// лишний импорт "strings" только ради одной проверки в тесте.
func strings_Contains(s, substr string) bool {
	for i := 0; i+len(substr) <= len(s); i++ {
		if s[i:i+len(substr)] == substr {
			return true
		}
	}
	return false
}
