const fs = require("fs");
const fsprom = require('fs').promises;
const boxIntersect = require("box-intersect");
const path = require('path');
const tempAssets = require("../src/tempAssets");

// const getLayers = (layers) => {
//   return new Promise((resolve, reject) => {
//     fs.readFile("./assets/assets.json", (err, data) => {
//       if (err) {
//         reject();
//       }
//       let assets = JSON.parse(data);
//       let requestedLayers = layers.split(",");

//       assets = assets.filter(asset => requestedLayers.includes(asset.id));
//       assets = assets.filter(asset => asset.scope == "public");
//       resolve(assets);
//     });
//   });
// }

const getLayers = async (layers) => {

  let assets = await getAllAssets();
  let requestedLayers = layers.split(",");
  assets = assets.filter(asset => requestedLayers.includes(asset.id));
  assets = assets.filter(asset => asset.scope == "public");
  return assets;

}

const getAllAssets = async () => {

  try {

    let assetsJson = await fsprom.readFile('./assets/assets.json', 'utf8');
    let assets = JSON.parse(assetsJson);
    let tempassets = await tempAssets.getTempAssets();
    assets.push(...tempassets);
    return assets;

  } catch (error) {

    console.log(error);
    return error;

  }

}

const getIntersectingLayers = (bb, layers) => {

  return new Promise((resolve, reject) => {
    fs.readFile("./assets/assets.json", (err, data) => {
      if (err) {
        reject();
      }
      let assets = JSON.parse(data);
      let requestedBB = bb.split(",").map(token => parseFloat(token));
      let requestedLayers = layers.split(",");

      assets = assets.filter(asset => requestedLayers.includes(asset.id));
      assets = assets.filter(asset => asset.scope == "public");

      assets = assets.filter(asset => {

        let overlaps = boxIntersect([
          [...asset.boundingbox],
          [...requestedBB]
        ]);

        if (overlaps.length > 0) {
          return true;
        }
        return false;
      });

      resolve(assets);

    });
  });

}

const getIntersecting = (bb) => {

  return new Promise((resolve, reject) => {
    fs.readFile("./assets/assets.json", (err, data) => {
      if (err) {
        reject();
      }
      let assets = JSON.parse(data);
      let requestedBB = bb.split(",").map(token => parseFloat(token));

      assets = assets.filter(asset => asset.scope == "public");
      assets = assets.filter(asset => {

        let overlaps = boxIntersect([
          [...asset.boundingbox],
          [...requestedBB]
        ]);

        if (overlaps.length > 0) {
          return true;
        }
        return false;
      });

      resolve(assets);

    });
  });

}

// const allLayersExist = (layers) => {

//   if (!layers) return Promise.reject();

//   return new Promise((resolve, reject) => {
//     fs.readFile("./assets/assets.json", (err, data) => {
//       if (err) {
//         reject();
//       }
//       let assets = JSON.parse(data);
//       layers = layers.split(",");
//       layers.forEach(layer => {
//         if (assets.findIndex(asset => asset.id == layer) == -1) {
//           reject();
//         }
//       });
//       resolve();
//     });
//   });

// }

const allLayersExist = async (layers) => {

  if (!layers) return Promise.reject();
  let assets = await getAllAssets();
  layers = layers.split(",");
  layers.forEach(layer => {
    if (assets.findIndex(asset => asset.id == layer) == -1) {
      return Promise.reject()
    }
  });
  return;
}

// const getPublicLayers = () => {

//   return new Promise((resolve, reject) => {
//     fs.readFile("./assets/assets.json", (err, data) => {
//       let assets = JSON.parse(data);
//       assets = assets.filter(asset => asset.scope == "public");
//       resolve(assets);
//     });
//   });

// }

const getPublicLayers = async () => {

  let assets = await getAllAssets();
  assets = assets.filter(asset => asset.scope == "public");
  return assets;

}

const isPublic = (url) => {

  return new Promise((resolve, reject) => {
    fs.readFile("./assets/assets.json", (err, data) => {
      let assets = JSON.parse(data);
      assets = assets.filter(asset => {
        let parentDir = path.dirname(asset.url);
        return !path.relative(parentDir, url).startsWith("..");
      });
      if (assets.length == 0) {
        resolve(false);
        return;
      }
      if (!assets[0].scope == "public") {
        resolve(false);
        return;
      }
      resolve(true);
    });
  });

}

module.exports = { getIntersectingLayers, getIntersecting, allLayersExist, getPublicLayers, isPublic, getLayers };