const express = require("express");
const { mediaInfo } = require("./mediaInfo");
const { store, settings } = require("./settings");
const globalEvents = require("./../constants/globalEvents");
const statuses = require("./../constants/statuses");
const expressModule = {};
const fs = require("fs");

let expressInstance;

/**
 * Function to enable tidal-hifi's express api
 */
expressModule.run = function(mainWindow) {
  /**
   * Shorthand to handle a fire and forget global event
   * @param {*} res
   * @param {*} action
   */
  function handleGlobalEvent(res, action) {
    mainWindow.webContents.send("globalEvent", action);
    res.sendStatus(200);
  }

  const expressApp = express();
  expressApp.get("/", (req, res) => res.send("Hello World!"));
  expressApp.get("/current", (req, res) => res.json(mediaInfo));
  expressApp.get("/image", (req, res) => {
    var stream = fs.createReadStream(mediaInfo.icon);
    stream.on("open", function() {
      res.set("Content-Type", "image/png");
      stream.pipe(res);
    });
    stream.on("error", function() {
      res.set("Content-Type", "text/plain");
      res.status(404).end("Not found");
    });
  });

  if (store.get(settings.playBackControl)) {
    expressApp.get("/play", (req, res) => handleGlobalEvent(res, globalEvents.play));
    expressApp.get("/pause", (req, res) => handleGlobalEvent(res, globalEvents.pause));
    expressApp.get("/next", (req, res) => handleGlobalEvent(res, globalEvents.next));
    expressApp.get("/previous", (req, res) => handleGlobalEvent(res, globalEvents.previous));
    expressApp.get("/playpause", (req, res) => {
      if (mediaInfo.status == statuses.playing) {
        handleGlobalEvent(res, globalEvents.pause);
      } else {
        handleGlobalEvent(res, globalEvents.play);
      }
    });
  }
  if (store.get(settings.api)) {
    let port = store.get(settings.apiSettings.port);

    expressInstance = expressApp.listen(port, "127.0.0.1", () => {});
    expressInstance.on("error", function(e) {
      let message = e.code;
      if (e.code === "EADDRINUSE") {
        message = `Port ${port} in use.`;
      }
      const { dialog } = require("electron");
      dialog.showErrorBox("Api failed to start.", message);
    });
  } else {
    expressInstance = undefined;
  }
};

module.exports = expressModule;
