import libtess from 'libtess'
import {area} from "geom/euclidean";

export default function pickPointInside2dPolygon(polygon) {
  function vertexCallback(data, tr) {
    tr.points[tr.counter] = data;
    tr.counter ++;
    if (tr.counter === 3) {
      const trArea = Math.abs(area(tr.points));
      if (trArea > tr.bestArea) {
        tr.bestArea = trArea;
        tr.bestTr = Array.from(tr.points); 
      }
      tr.counter = 0;
    }
  }

  const tessy = new libtess.GluTesselator();
  tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA, vertexCallback);
  tessy.gluTessNormal(0, 0, 1);
  const tracker = {
    points: [],
    bestTr: null,
    bestArea: -1,
    counter: 0
  };
  tessy.gluTessBeginPolygon(tracker);

  for (const path of polygon) {
    tessy.gluTessBeginContour();
    for (const p of path) {
      tessy.gluTessVertex([p.x, p.y, 0], p);
    }
    tessy.gluTessEndContour();
  }
  tessy.gluTessEndPolygon();

  if (tracker.bestTr === null) {
    return null;
  }
  
  const center = tracker.bestTr[0].copy();
  center._plus(tracker.bestTr[1]);
  center._plus(tracker.bestTr[2]);
  center._divide(3);
  return center;
}