"""Starts everything: sensors -> recorder -> web server on port 8080."""
import signal
import sys
import threading

from . import config, server
from .recorder import Recorder
from .sensors import SensorManager


def main():
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8080
    recorder = Recorder()
    manager = SensorManager(recorder.emit)
    manager.start(config.load_sensors())
    dyno = server.Dyno(recorder, manager)
    httpd = server.serve(dyno, port)

    stop = threading.Event()

    def shut_down(*_):
        if not stop.is_set():
            stop.set()
            threading.Thread(target=httpd.shutdown, daemon=True).start()

    signal.signal(signal.SIGTERM, shut_down)
    signal.signal(signal.SIGINT, shut_down)
    print("Mini bike dyno running on port %d, data in %s" % (port, config.DATA_DIR), flush=True)
    httpd.serve_forever()
    manager.start([])  # stop the sensors
    if recorder.run is not None:
        recorder.manual_stop()  # save a run that was in progress


if __name__ == "__main__":
    main()
