'use strict';

var dummyClass = 'DummyClass';
exports.edgeShapesClass = dummyClass;
exports.filterClass = dummyClass;
exports.forceAtlas2Class = dummyClass;
exports.loadGEXFClass = dummyClass;
exports.loadJSONClass = dummyClass;
exports.nOverlapClass = dummyClass;
exports.neoCypherClass = dummyClass;
exports.neoGraphItemsProducersClass = dummyClass;
exports.nodeShapesClass = dummyClass;
exports.randomizeNodePositionsClass = dummyClass;
exports.relativeSizeClass = dummyClass;
exports.sigmaClass = dummyClass;
exports.sigmaEnableSVGClass = dummyClass;
exports.sigmaEnableWebGLClass = dummyClass;
exports.forceLinkClass = dummyClass;

if (typeof window !== 'undefined') {

const SJS = require('react-sigma');
const FL = require('react-sigma/lib/ForceLink');

exports.edgeShapesClass = SJS.EdgeShapes;
exports.filterClass = SJS.Filter;
exports.forceAtlas2Class = SJS.ForceAtlas2;
exports.loadGEXFClass = SJS.LoadGEXF;
exports.loadJSONClass = SJS.LoadJSON;
exports.nOverlapClass = SJS.NOverlap;
exports.neoCypherClass = SJS.NeoCypher;
exports.neoGraphItemsProducersClass = SJS.NeoGraphItemsProducers;
exports.nodeShapesClass = SJS.NodeShapes;
exports.randomizeNodePositionsClass = SJS.RandomizeNodePositions;
exports.relativeSizeClass = SJS.RelativeSize;
exports.sigmaClass = SJS.Sigma;
exports.sigmaEnableSVGClass = SJS.SigmaEnableSVG;
exports.sigmaEnableWebGLClass = SJS.SigmaEnableWebGL;
exports.forceLinkClass = FL.default;

}

exports.setSigmaRef = function(props) {
  if (props && props.sigma) {
    window.sigmaGargInstance = props.sigma;
  }
};
exports.getSigmaRef = function() {
  return window.sigmaGargInstance;
};
exports.goToImpl = function(cam) {
  return function(props) {
    return cam.goTo(props);
  };
};
exports.pauseForceAtlas2 = function() {
  var s = window.sigmaGargInstance;
  if (s) {
    if (s.isForceAtlas2Running()) {
      s.stopForceAtlas2()
    }
    else {
      s.startForceAtlas2()
    }
  }
};

var trackMouse = function(cursorSize, e) {

    if(!e.shiftKey) {
      var partialGraph = window.sigmaGargInstance;
      // new sigma.js 2D mouse context
      var ctx = partialGraph.renderers[0].contexts.mouse;
      ctx.globalCompositeOperation = "source-over";

      // clear zone each time to prevent repeated frame artifacts
      ctx.clearRect(50, 50,
                    partialGraph.renderers[0].container.offsetWidth,
                    partialGraph.renderers[0].container.offsetHeight);

      // classic mousemove event or other similar non-sigma events

      var coord = window.sigma.utils.mouseCoords(e)
      var x = (coord.x + coord.clientX) / 2 // ; // sigma.utils.getX(e);
      var y = (coord.y + coord.clientY) /2 // ; // sigma.utils.getY(e);
      console.log('trackMouse', coord);
      // optional: make more labels appear on circle hover (/!\ costly /!\ esp. on large graphs)
//      if (partialGraph.conf.moreLabelsUnderArea) {
//        // convert screen => mouse => cam
//        var mouseCoords = (50,50); // sigma.utils.mouseCoords(e)
//        var camCoords = partialGraph.cam.cameraPosition(mouseCoords.x, mouseCoords.y)
//
//        var exactNodeset = circleGetAreaNodes(camCoords.x,camCoords.y)
//        // console.log("nodes under circle:", exactNodeset)
//
//        // we'll use labelThreshold / 3 as the "boosted" cam:size threshold
//        var pfx = partialGraph.cam.readPrefix
//        var toRedraw = []
//        for (var k in exactNodeset) {
//          var n = partialGraph.graph.nodes(exactNodeset[k])
//          if(!n.hidden && n[pfx+'size'] > (partialGraph.customSettings.labelThreshold / 3)) {
//            toRedraw.push(n)
//          }
//        }
//        redrawNodesInHoverLayer(toRedraw, "hovers")
//      }

      // draw the circle itself
      ctx.strokeStyle = '#000';
      ctx.lineWidth = 1;
      ctx.fillStyle = "#71C3FF";
      ctx.globalAlpha = 0.5;
      ctx.beginPath();
      ctx.arc(x, y, cursorSize, 0, Math.PI * 2, true);
      ctx.closePath();
      ctx.fill();
      ctx.stroke();
      ctx.globalAlpha = 1

    }

};

exports.sigmaOnMouseMove = function(props) {
  return function(e) {
    return function() {
      if(typeof(window.sigmaGargInstance) !== "undefined") {
          if(props.cursorSize > 0) trackMouse(props.cursorSize, e);
      }
    };
  };
};
