/**
Implémente la télécommande JOSM

Le HTML géré pourrait ressembler à :

```html
<button
    type="button"
    data-controller="josm"
    data-action="click->josm#remoteControl"
    data-josm-commands-value="…"
>JOSM</button>
```

Où la valeur `commands` prend la forme d’un objet JSON dont chacune des entrées
représente une commande à enchaîner successivement et où la clef est le chemin
de la commande et la valeur un objet dont chacune des entrées représente les
paramètres de la commande.

Par exemple :

```json
{
    "version": {},
    "imagery": {
        "id": "osmfr",
    }
}
```

Avec cette valeur de `commands`, les appels successifs aux endpoints `/version`
puis `imagery?id=osmfr` seront effectués.
 
Cf <https://josm.openstreetmap.de/wiki/Help/RemoteControlCommands>

TODO Gérer le cas où il n’y a pas de JOSM en face pourrait être plus user-friendly.
**/
import { Controller } from '@hotwired/stimulus';

function until(conditionFunction, maximum, message) {
  var current = maximum;
  const poll = function (resolve) {
    if (conditionFunction()) {
	    resolve();
    } else { 
	    current -= 1;
	    if (current > 0) {
		    setTimeout(function() {
			    return poll(resolve); 
		    }, 400);
	    } else {
		    alert(message);
	    }
    }
  };
  return new Promise(poll);
}

export default class extends Controller {
    static values = {
        commands: String,
	ready: Boolean
    }

    remoteControl() {
        const baseurl = 'http://localhost:8111';
        const _this = this, commands = JSON.parse(this.commandsValue);
        for (var command in commands) {
            var url = baseurl + '/' + command, params = new URLSearchParams();
            for (var name in commands[command]) {
                params.append(name, commands[command][name]);
            }
            if (Array.from(params.length > 0)) {
                url += '?' + params.toString();
            }
            fetch(url)
                    .then(function (response) {
                        return response.text();
                    })
                    .then(function (text) {
                    });
        }
    }

    isReady() {
	    const url = 'http://localhost:8111/version';
	    const _this = this;
	    this.readyValue = false;
	    fetch(url)
		    .catch(function (error) {
			    _this.readyValue = false;
		    })
		    .then(function (response) {
			    if (typeof response === 'undefined') {
			        return;
			    }
			    return response.text();
		    })
		    .then(function (text) {
			    if (typeof response === 'undefined') {
			        _this.readyValue = false;
			    } else {
			        _this.readyValue = true;
			    }
		    });
    }

    remoteControlIfReady() {
	    const _this = this;
	    until(function () { return _this.isReady(); }, 10, 'JOSM n´est pas disponible pour le moment').then(function () { _this.remoteControl(); });

    }
}
