// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "InputCoreTypes.h"

/**
 * Traduction d'une touche de reference vers la disposition clavier du systeme.
 *
 * LE PROBLEME. Un IMC stocke des FKey -- EKeys::W --, c'est-a-dire des LETTRES.
 * Or Windows livre au moteur un virtual key code deja traduit par la disposition
 * active : sur un clavier AZERTY, la touche en haut a gauche du bloc de
 * deplacement envoie VK_Z, qu'Unreal lit donc comme EKeys::Z. Le mapping "W" ne
 * se declenche jamais, et le joueur pousse son personnage en arriere en croyant
 * avancer. Rien de tout ca n'est visible en developpant sur un clavier QWERTY.
 *
 * LA REPONSE. On ne raisonne plus en lettres mais en POSITIONS. Chaque touche
 * par defaut de l'IMC est lue comme une position physique sur un clavier QWERTY
 * US -- c'est le referentiel dans lequel les IMC sont ecrits -- et l'on demande
 * a l'OS quelle touche occupe cette position sur la disposition courante. La
 * geometrie de la main est preservee : le bloc WASD devient ZQSD en AZERTY,
 * reste WASD en QWERTZ (seuls Y et Z y sont echanges), et suit les positions en
 * Dvorak ou Colemak. Aucune table par pays a maintenir, et les dispositions
 * qu'on n'a jamais vues sont traitees comme les autres.
 *
 * PORTEE. Seule la zone alphanumerique bouge d'une disposition a l'autre. Les
 * modificateurs, la barre d'espace, Echap, les fonctions, les fleches, le pave
 * numerique et la manette occupent la meme position partout : ils ne figurent
 * pas dans la table de reference et ressortent donc inchanges. C'est aussi ce
 * qui garantit qu'on ne casse rien -- une touche inconnue est rendue telle quelle.
 *
 * WINDOWS UNIQUEMENT pour l'instant. Sur les autres plateformes la touche est
 * rendue inchangee, soit exactement le comportement d'avant.
 */
namespace KeyboardLayout
{
	/**
	 * Rend la touche qui occupe, sur la disposition active, la position que
	 * ReferenceKey occupe sur un clavier QWERTY US.
	 *
	 * Rend ReferenceKey inchangee si la touche n'est pas concernee par la
	 * disposition (espace, modificateurs, manette...), si la plateforme n'est pas
	 * geree, ou si l'OS ne sait pas repondre. Jamais de touche invalide en sortie.
	 */
	EMBERWILD_API FKey RemapKeyToActiveLayout(const FKey& ReferenceKey);

	/**
	 * L'identifiant de la disposition active, pour le journal : "0000040C" pour
	 * le francais, "00000409" pour l'anglais US. Sert au diagnostic quand un
	 * testeur signale des touches inattendues -- c'est la premiere chose a lire.
	 */
	EMBERWILD_API FString GetActiveLayoutId();
}
