/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import { describe, it, expect } from 'vitest';
import { formatKeyBinding, formatCommand } from './keybindingUtils.js';
import { Command, KeyBinding } from './keyBindings.js';

describe('keybindingUtils', () => {
  describe('formatKeyBinding', () => {
    const testCases: Array<{
      name: string;
      binding: KeyBinding;
      expected: {
        darwin: string;
        win32: string;
        linux: string;
        default: string;
      };
    }> = [
      {
        name: 'simple key',
        binding: new KeyBinding('a'),
        expected: { darwin: 'A', win32: 'A', linux: 'A', default: 'A' },
      },
      {
        name: 'named key (return)',
        binding: new KeyBinding('enter'),
        expected: {
          darwin: 'Enter',
          win32: 'Enter',
          linux: 'Enter',
          default: 'Enter',
        },
      },
      {
        name: 'named key (escape)',
        binding: new KeyBinding('escape'),
        expected: { darwin: 'Esc', win32: 'Esc', linux: 'Esc', default: 'Esc' },
      },
      {
        name: 'ctrl modifier',
        binding: new KeyBinding('ctrl+c'),
        expected: {
          darwin: 'Ctrl+C',
          win32: 'Ctrl+C',
          linux: 'Ctrl+C',
          default: 'Ctrl+C',
        },
      },
      {
        name: 'cmd modifier',
        binding: new KeyBinding('cmd+z'),
        expected: {
          darwin: 'Cmd+Z',
          win32: 'Win+Z',
          linux: 'Super+Z',
          default: 'Cmd/Win+Z',
        },
      },
      {
        name: 'alt/option modifier',
        binding: new KeyBinding('alt+left'),
        expected: {
          darwin: 'Option+Left',
          win32: 'Alt+Left',
          linux: 'Alt+Left',
          default: 'Alt+Left',
        },
      },
      {
        name: 'shift modifier',
        binding: new KeyBinding('shift+up'),
        expected: {
          darwin: 'Shift+Up',
          win32: 'Shift+Up',
          linux: 'Shift+Up',
          default: 'Shift+Up',
        },
      },
      {
        name: 'multiple modifiers (ctrl+shift)',
        binding: new KeyBinding('ctrl+shift+z'),
        expected: {
          darwin: 'Ctrl+Shift+Z',
          win32: 'Ctrl+Shift+Z',
          linux: 'Ctrl+Shift+Z',
          default: 'Ctrl+Shift+Z',
        },
      },
      {
        name: 'all modifiers',
        binding: new KeyBinding('ctrl+alt+shift+cmd+a'),
        expected: {
          darwin: 'Ctrl+Option+Shift+Cmd+A',
          win32: 'Ctrl+Alt+Shift+Win+A',
          linux: 'Ctrl+Alt+Shift+Super+A',
          default: 'Ctrl+Alt+Shift+Cmd/Win+A',
        },
      },
    ];

    testCases.forEach(({ name, binding, expected }) => {
      describe(`${name}`, () => {
        it('formats correctly for darwin', () => {
          expect(formatKeyBinding(binding, 'darwin')).toBe(expected.darwin);
        });
        it('formats correctly for win32', () => {
          expect(formatKeyBinding(binding, 'win32')).toBe(expected.win32);
        });
        it('formats correctly for linux', () => {
          expect(formatKeyBinding(binding, 'linux')).toBe(expected.linux);
        });
        it('formats correctly for default', () => {
          expect(formatKeyBinding(binding, 'default')).toBe(expected.default);
        });
      });
    });
  });

  describe('formatCommand', () => {
    it('formats default commands (using default platform behavior)', () => {
      expect(formatCommand(Command.QUIT, undefined, 'default')).toBe('Ctrl+C');
      expect(formatCommand(Command.SUBMIT, undefined, 'default')).toBe('Enter');
      expect(
        formatCommand(Command.TOGGLE_BACKGROUND_SHELL, undefined, 'default'),
      ).toBe('Ctrl+B');
    });

    it('returns empty string for unknown commands', () => {
      expect(
        formatCommand(
          'unknown.command' as unknown as Command,
          undefined,
          'default',
        ),
      ).toBe('');
    });
  });
});
