//
//  Keyboard.cpp
//  Clock Signal
//
//  Created by Thomas Harte on 02/08/2019.
//  Copyright © 2019 Thomas Harte. All rights reserved.
//

#include "Keyboard.hpp"

using namespace Apple::Macintosh;

uint16_t KeyboardMapper::mapped_key_for_key(Inputs::Keyboard::Key key) {
	using Key = Inputs::Keyboard::Key;
	using MacKey = Apple::Macintosh::Key;
	switch(key) {
		default: return KeyboardMachine::MappedMachine::KeyNotMapped;

#define Bind(x, y) case Key::x: return uint16_t(y)

		Bind(BackTick, MacKey::BackTick);
		Bind(k1, MacKey::k1);	Bind(k2, MacKey::k2);	Bind(k3, MacKey::k3);
		Bind(k4, MacKey::k4);	Bind(k5, MacKey::k5);	Bind(k6, MacKey::k6);
		Bind(k7, MacKey::k7);	Bind(k8, MacKey::k8);	Bind(k9, MacKey::k9);
		Bind(k0, MacKey::k0);
		Bind(Hyphen, MacKey::Hyphen);
		Bind(Equals, MacKey::Equals);
		Bind(Backspace, MacKey::Backspace);

		Bind(Tab, MacKey::Tab);
		Bind(Q, MacKey::Q);		Bind(W, MacKey::W);		Bind(E, MacKey::E);		Bind(R, MacKey::R);
		Bind(T, MacKey::T);		Bind(Y, MacKey::Y);		Bind(U, MacKey::U);		Bind(I, MacKey::I);
		Bind(O, MacKey::O);		Bind(P, MacKey::P);
		Bind(OpenSquareBracket, MacKey::OpenSquareBracket);
		Bind(CloseSquareBracket, MacKey::CloseSquareBracket);

		Bind(CapsLock, MacKey::CapsLock);
		Bind(A, MacKey::A);		Bind(S, MacKey::S);		Bind(D, MacKey::D);		Bind(F, MacKey::F);
		Bind(G, MacKey::G);		Bind(H, MacKey::H);		Bind(J, MacKey::J);		Bind(K, MacKey::K);
		Bind(L, MacKey::L);
		Bind(Semicolon, MacKey::Semicolon);
		Bind(Quote, MacKey::Quote);
		Bind(Enter, MacKey::Return);

		Bind(LeftShift, MacKey::Shift);
		Bind(Z, MacKey::Z);		Bind(X, MacKey::X);		Bind(C, MacKey::C);		Bind(V, MacKey::V);
		Bind(B, MacKey::B);		Bind(N, MacKey::N);		Bind(M, MacKey::M);
		Bind(Comma, MacKey::Comma);
		Bind(FullStop, MacKey::FullStop);
		Bind(ForwardSlash, MacKey::ForwardSlash);
		Bind(RightShift, MacKey::Shift);

		Bind(Left, MacKey::Left);
		Bind(Right, MacKey::Right);
		Bind(Up, MacKey::Up);
		Bind(Down, MacKey::Down);

		Bind(LeftOption, MacKey::Option);
		Bind(RightOption, MacKey::Option);
		Bind(LeftMeta, MacKey::Command);
		Bind(RightMeta, MacKey::Command);

		Bind(Space, MacKey::Space);
		Bind(Backslash, MacKey::Backslash);

		Bind(KeypadDelete, MacKey::KeypadDelete);
		Bind(KeypadEquals, MacKey::KeypadEquals);
		Bind(KeypadSlash, MacKey::KeypadSlash);
		Bind(KeypadAsterisk, MacKey::KeypadAsterisk);
		Bind(KeypadMinus, MacKey::KeypadMinus);
		Bind(KeypadPlus, MacKey::KeypadPlus);
		Bind(KeypadEnter, MacKey::KeypadEnter);
		Bind(KeypadDecimalPoint, MacKey::KeypadDecimalPoint);

		Bind(Keypad9, MacKey::Keypad9);
		Bind(Keypad8, MacKey::Keypad8);
		Bind(Keypad7, MacKey::Keypad7);
		Bind(Keypad6, MacKey::Keypad6);
		Bind(Keypad5, MacKey::Keypad5);
		Bind(Keypad4, MacKey::Keypad4);
		Bind(Keypad3, MacKey::Keypad3);
		Bind(Keypad2, MacKey::Keypad2);
		Bind(Keypad1, MacKey::Keypad1);
		Bind(Keypad0, MacKey::Keypad0);

#undef Bind
	}
}
