<!DOCTYPE html>
<html lang="fr">
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Contrôle du robot</title>
	</head>
	<body>
		<h1>Contrôle du robot sans fils</h1>
		<p>
			Cette page permet de contrôler le robot depuis un PC portable
			connecté au WiFi du robot. Elle est destinée aux personnes n'ayant
			pas de smartphone.
		</p>
		<h2>Paramètres de contrôle</h2>
		<p>
			Ici vous pourrez paramétrer les contrôles du robot, rentrer son
			adresse IP ainsi que lui indiquer la distance à parcourir ou l'angle
			de rotation désiré.
		</p>
		<form class="settings" id="settings">
			<label>
				<span>Adresse IP du robot</span>
				<input
					type="text"
					name="ip-address"
					title="Adresse IP du robot (ex: 192.168.0.1)"
					pattern="\d+\.\d+\.\d+\.\d+"
					placeholder="192.168.0.0"
					required
				/>
			</label>
			<button>Se connecter</button>
		</form>
		<div class="controls">
			<label>
				<span>Rotation en degrés</span>
				<input
					type="number"
					title="Rotation en degrés (0° - 360°)"
					min="0"
					max="360"
					step="1"
					placeholder="90"
					onchange="rotate()"
				/>
			</label>
			<label>
				<span>Longueur en cm</span>
				<input
					type="number"
					title="Longueur en cm (0 - 2^31)"
					min="-2147483647"
					step="1"
					max="2147483647"
					placeholder="10"
					onchange="move()"
				/>
			</label>
		</div>
		<h2>Contrôle</h2>
		<p>
			Amusez vous ! Pour contrôler le robot, utilisez les flèches
			directionnelles pour le diriger et la barre espace pour le stopper.
		</p>
	</body>
	<script type="module">
		/**
		 * A command string.
		 * @typedef {('forward' | 'backward' | 'left' | 'right' | 'stop')} Command
		 */

		/**
		 * Send command to the robot.
		 *
		 * @param {string} endpoint Address IP of the robot.
		 * @param {Command} command Command to send.
		 * @param {number} value Value of the command if needed.
		 *
		 * @returns {Promise<void>}
		 */
		async function sendCommand(endpoint, command, value) {
			const url = new URL(
				`/get?command=${command}&value=${value}`,
				endpoint
			)
			const response = await fetch(url)
			const text = await response.text()
			console.log(text)
		}

		/**
		 * Get robot endpoint address.
		 *
		 * @returns {string}
		 */
		function getEndpoint() {
			const endpoint = sessionStorage.getItem('robot-endpoint')
			if (endpoint === null) {
				alert("Aucune adresse IP n'a été renseignée !")
				throw new Error('no given ip address')
			}
			return endpoint
		}

		/**
		 * Set robot endpoint address.
		 *
		 * @param {string} ip Robot ip.
		 *
		 * @returns void
		 */
		function setEndpoint(ip) {
			sessionStorage.setItem('robot-endpoint')
		}

		document
			.querySelector('#settings')
			.addEventListener('submit', async (event) => {
				// Don't interrupt event if not form submitting
				if (!(event instanceof SubmitEvent)) return true
				if (event.target === null) return true
				// Disable form sending
				event.preventDefault()

				const form = new FormData(event.target)
				const ipAddress = form.get('ip-address')

				if (ipAddress === null) return

				const endpoint = `http://${ipAddress}`
				await testEndpoint(endpoint)
				setEndpoint(endpoint)
			})

		/**
		 * Test connection to endpoint.
		 * 
		 * @param {string} endpoint Endpoint to test for.
		 * 
		 * @returns {void}
		 * @throws {Error} Endpoint unreachable.
		 */
		async function testEndpoint(endpoint) {
			try {
				const response = await fetch(endpoint)
				if (response.ok) return
			} catch (cause) {
				alert(`Impossible de joindre l'adresse "${endpoint}"`)
				throw new Error(`unable to connect to robot at ${endpoint}`, {
					cause,
				})
			}
		}

		document.addEventListener('keydown', (event) => {
			const key = event.keyCode
			const { command, value } = keyMap[key]
			const endpoint = getEndpoint()
			sendCommand(endpoint, command, value)
		})

		function storeInput() {
			ipInput = document.getElementById('ip').value
			valueRot = document.getElementById('valueRot').value
			valueLength = document.getElementById('valueLength').value
			keyMap = {
				38: { command: 'forward', value: valueLength },
				40: { command: 'backward', value: valueLength },
				37: { command: 'left', value: valueRot },
				39: { command: 'right', value: valueRot },
				32: { command: 'stop', value: 0 },
			}
		}
	</script>
</html>