<?php

namespace MintyPHP\Tests\Service\Ui;

use MintyPHP\Service\Ui\HotkeyService;
use PHPUnit\Framework\TestCase;

class HotkeyServiceTest extends TestCase
{
    public function testListReturnsNonEmptyArray(): void
    {
        $result = HotkeyService::list();

        $this->assertNotEmpty($result);
    }

    public function testListEntriesHaveRequiredKeys(): void
    {
        $result = HotkeyService::list();

        foreach ($result as $index => $entry) {
            $this->assertArrayHasKey('action_key', $entry, "Entry #{$index} is missing 'action_key'");
            $this->assertArrayHasKey('mac', $entry, "Entry #{$index} is missing 'mac'");
            $this->assertArrayHasKey('win', $entry, "Entry #{$index} is missing 'win'");
            $this->assertNotEmpty($entry['action_key'], "Entry #{$index} has empty 'action_key'");
            $this->assertNotEmpty($entry['mac'], "Entry #{$index} has empty 'mac'");
            $this->assertNotEmpty($entry['win'], "Entry #{$index} has empty 'win'");
        }
    }

    public function testListEntriesHaveExactlyThreeKeys(): void
    {
        $result = HotkeyService::list();

        foreach ($result as $index => $entry) {
            $this->assertCount(3, $entry, "Entry #{$index} should have exactly 3 keys");
        }
    }

    public function testSearchKeywordsReturnsNonEmptyArray(): void
    {
        $result = HotkeyService::searchKeywords();

        $this->assertNotEmpty($result);
    }

    public function testSearchKeywordsContainsExpectedTerms(): void
    {
        $result = HotkeyService::searchKeywords();

        $this->assertContains('hotkey', $result);
        $this->assertContains('shortcut', $result);
        $this->assertContains('keyboard', $result);
    }

    public function testSearchKeywordsAreAllStrings(): void
    {
        $result = HotkeyService::searchKeywords();

        foreach ($result as $keyword) {
            $this->assertNotEmpty($keyword);
        }
    }

    public function testListReturnsDeterministicResult(): void
    {
        $first = HotkeyService::list();
        $second = HotkeyService::list();

        $this->assertSame($first, $second);
    }

    public function testSearchKeywordsReturnsDeterministicResult(): void
    {
        $first = HotkeyService::searchKeywords();
        $second = HotkeyService::searchKeywords();

        $this->assertSame($first, $second);
    }
}
