'use strict';
import { h, html, render, useEffect, useState } from './preact.min.js';


const Configuration = function (props) {
  const [url, setUrl] = useState(props.config.url || '');
  const [pub, setPub] = useState(props.config.pub || '');
  const [sub, setSub] = useState(props.config.sub || '');

  useEffect(() => {
    setUrl(props.config.url);
    setPub(props.config.pub);
    setSub(props.config.sub);
  }, [props.config]);

  const update = (name, val) =>
    fetch('/api/config/set', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        [name]: val
      })
    })
      .catch(err => {
        console.log(err);
        enable(false);
      });

  const updateurl = ev => update('url', url);
  const updatepub = ev => update('pub', pub);
  const updatesub = ev => update('sub', sub);

  return html`
<h3 style="background: #c03434; color: #fff; padding: 0.4em;">
  Device Configuration</h3>
<div style="margin: 0.5em 0; display: flex;">
  <span class="addon nowrap">MQTT server:</span>
  <input type="text" style="flex: 1 100%;"
        value=${url} onchange=${updateurl}
        oninput=${ev => setUrl(ev.target.value)} />
  <button class="btn" disabled=${!url} onclick=${updateurl}
    style="margin-left: 1em; background: #8aa;">Update</button>
</div>
<div style="margin: 0.5em 0; display: flex; ">
  <span class="addon nowrap">Subscribe topic:</span>
  <input type="text" style="flex: 1 100%;"
      value=${sub} onchange=${updatesub}
      oninput=${ev => setSub(ev.target.value)} />
  <button class="btn" disabled=${!sub} onclick=${updatesub}
    style="margin-left: 1em; background: #8aa;">Update</button>
</div>
<div style="margin: 0.5em 0; display: flex;">
  <span class="addon nowrap">Publish topic:</span>
  <input type="text" style="flex: 1 100%;"
        value=${pub} onchange=${updatepub}
        oninput=${ev => setPub(ev.target.value)} />
  <button class="btn" disabled=${!pub} onclick=${updatepub}
    style="margin-left: 1em; background: #8aa;">Update</button>
</div>`;
};


const App = function (props) {
  const [config, setConfig] = useState({});

  const getconfig = () =>
    fetch('/api/config/get')
      .then(r => r.json())
      .then(r => setConfig(r))
      .catch(err => console.log(err));

  useEffect(() => {
    getconfig();
  }, []);

  return html`
<h1>Basic Preact-based UI demo</h1>
<div class="col col-6">
  ${h(Configuration, { config })}
</div>
<button onclick=${getconfig}>Get configuration</button>`;
};

window.onload = () => render(h(App), document.body);