package audio

import (
	"os"
	"testing"
	"time"
)

func TestPlayMP3LoopStop(t *testing.T) {
	testFile := "testdata/test.mp3"
	if _, err := os.Stat(testFile); os.IsNotExist(err) {
		t.Skip("测试文件不存在:", testFile)
	}

	f, err := os.Open(testFile)
	if err != nil {
		t.Fatalf("打开测试文件失败: %v", err)
	}

	player, cleanup, err := PlayMP3Loop(f)
	if err != nil {
		t.Fatalf("PlayMP3Loop 失败: %v", err)
	}
	if player == nil {
		t.Fatal("player 不应为 nil")
	}

	// 等待一小段时间确保播放开始
	time.Sleep(100 * time.Millisecond)

	// 调用清理函数
	if err := cleanup(); err != nil {
		t.Errorf("cleanup 失败: %v", err)
	}

	// 验证文件已关闭
	if err := f.Close(); err == nil {
		t.Error("文件应该已经被 cleanup 关闭")
	}
}

func TestConcurrentPlay(t *testing.T) {
	testFile := "testdata/test.mp3"
	if _, err := os.Stat(testFile); os.IsNotExist(err) {
		t.Skip("测试文件不存在:", testFile)
	}

	// 启动多个并发播放
	const numPlayers = 3
	players := make([]any, numPlayers)
	cleanups := make([]func() error, numPlayers)

	for i := 0; i < numPlayers; i++ {
		f, err := os.Open(testFile)
		if err != nil {
			t.Fatalf("打开测试文件 %d 失败: %v", i, err)
		}

		player, cleanup, err := PlayMP3Loop(f)
		if err != nil {
			t.Fatalf("PlayMP3Loop %d 失败: %v", i, err)
		}
		players[i] = player
		cleanups[i] = cleanup
	}

	// 等待播放
	time.Sleep(200 * time.Millisecond)

	// 清理所有播放器
	for i, cleanup := range cleanups {
		if err := cleanup(); err != nil {
			t.Errorf("cleanup %d 失败: %v", i, err)
		}
	}
}
