package speech

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

func TestParseMacVoice(t *testing.T) {
	fixtureWithKyoko := `Eddy (Japanese (Japan)) ja_JP    # こんにちは! 私の名前はEddyです。
Kyoko               ja_JP    # こんにちは! 私の名前はKyokoです。
Otoya               ja_JP    # こんにちは! 私の名前はOtoyaです。`
	v, ok := parseMacVoice([]byte(fixtureWithKyoko))
	if !ok || v != "Kyoko" {
		t.Errorf("parseMacVoice with Kyoko = (%q, %v), want (Kyoko, true)", v, ok)
	}

	fixtureWithoutKyoko := `Eddy (Japanese (Japan)) ja_JP    # こんにちは! 私の名前はEddyです。
Otoya               ja_JP    # こんにちは! 私の名前はOtoyaです。`
	v2, ok2 := parseMacVoice([]byte(fixtureWithoutKyoko))
	if !ok2 || v2 != "Eddy" {
		t.Errorf("parseMacVoice without Kyoko = (%q, %v), want (Eddy, true)", v2, ok2)
	}

	fixtureNoJapanese := `Alex                en_US    # Hello
Fred                en_US    # Hello`
	v3, ok3 := parseMacVoice([]byte(fixtureNoJapanese))
	if ok3 || v3 != "" {
		t.Errorf("parseMacVoice no ja_JP = (%q, %v), want ('', false)", v3, ok3)
	}
}

func TestSpeakReal(t *testing.T) {
	if os.Getenv("CHIRAMI_LIVE_TESTS") == "" {
		t.Skip("talks to the network or makes sound; set CHIRAMI_LIVE_TESTS=1")
	}
	if testing.Short() {
		t.Skip("skipping real speak test in short mode")
	}

	// Real invocation of Speak on macOS
	if runtime.GOOS == "darwin" {
		err := Speak("テスト")
		if err != nil {
			t.Fatalf("Speak failed: %v", err)
		}

		// Fast subsequent call to verify killing previous process works cleanly
		time.Sleep(50 * time.Millisecond)
		err = Speak("こんにちは")
		if err != nil {
			t.Fatalf("Second Speak failed: %v", err)
		}

		time.Sleep(600 * time.Millisecond)
	}
}

func TestLinuxSpeech(t *testing.T) {
	if os.Getenv("CHIRAMI_LIVE_TESTS") == "" {
		t.Skip("talks to the network or makes sound; set CHIRAMI_LIVE_TESTS=1")
	}
	if runtime.GOOS != "linux" {
		t.Skip("linux-only test")
	}
	err := Speak("こんにちは")
	if err != nil {
		t.Fatalf("Linux Speak failed: %v", err)
	}
	time.Sleep(1 * time.Second)
}
