const axios = require("axios");

module.exports = (fastify, opts, done) => {
  fastify.get("/flight/:id", async (req, reply) => {
    const ENDPOINT = "https://www.flightradar24.com/v1/search/web/find";
    const FORMAT = "-";
    if (req.params.id) {
      axios
        .get(ENDPOINT, {
          params: {
            format: FORMAT,
            query: req.params.id,
            limit: 16,
            type: "schedule",
          },
        })
        .then((res) => reply.send(res.data));
    } else {
      return reply.send([]);
    }
    return reply;
  });
  fastify.get("/place/:id", async (req, reply) => {
    const ENDPOINT = "https://nominatim.openstreetmap.org/";
    const FORMAT = "jsonv2";
    if (req.params.id) {
      axios
        .get(ENDPOINT, {
          params: {
            format: FORMAT,
            q: req.params.id,
          },
        })
        .then((res) => reply.send(res.data));
    } else {
      return reply.send([]);
    }
    return reply;
  });

  fastify.get("/gpx/:id", async (req, reply) => {
    if (req.params.id == undefined)
    return reply.code(400).send({ error: "No ID query parameter" });

  fastify.level.db.get(req.params.id, (err, val) => {
    if (err) {
      console.warn(err);
      reply.code(500).send();
    } else {
      let file = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="EMTAC BTGPS Trine II DataLog Dump 1.0 - http://www.ayeltd.biz" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">'
      const data = JSON.parse(val);
      const gen_wpt = (name,desc,latlon,icon="Flag") => `<wpt lat="${latlon[0]}" lon="${latlon[1]}"><ele>0</ele><name>${name}</name><cmt>-</cmt><desc>${desc}</desc><sym>${icon}</sym></wpt>`
      const esc_str = (str) => (str||"Undefined").replace('"',"&quot;").replace("'","&apos;").replace("<","&lt;").replace(">","&gt;").replace("&","&amp;").replace("\n","...")
      data.main.forEach(a => {
        file+= gen_wpt(esc_str(a.hotel.name), esc_str(a.hotel.notes), a.hotel.latlon, icon="Hotel");
        a.places.restaurants.forEach(b => {
          file+= gen_wpt(esc_str(b.name), esc_str(b.notes), b.latlon, icon="Restaurant");
        });
        a.places.activities.forEach(b => {
          file+= gen_wpt(esc_str(b.name), esc_str(b.notes), b.latlon, icon="Tree");
        });
      });
      file+="</gpx>";
      reply.header('Content-Type', 'application/gpx+xml');
      reply.header('Content-Disposition', `attachment; filename=${req.params.id}.gpx`);
      reply.send(file);
    }
  });
  return reply;
  });

  fastify.get("/:id", async (req, reply) => {
    if (req.params.id == undefined)
      return reply.code(400).send({ error: "No ID query parameter" });

    fastify.level.db.get(req.params.id, (err, val) => {
      if (err) {
        console.warn(err);
        reply.code(500).send();
      } else {
        reply.send(JSON.parse(val));
      }
    });
    return reply;
  });

  fastify.post("/:id", async (req, reply) => {
    if (req.params.id == undefined)
      return reply.code(400).send({ error: "No ID query parameter" });

    fastify.level.db.put(req.params.id, JSON.stringify(req.body), (err) => {
      if (err) {
        console.warn(err);
        reply.code(500).send({ error: "Error with DB" });
      } else {
        reply.send({ content: "ok" });
      }
    });
    return reply;
  });

  done();
};