import * as Terraformer from "./terraformer";

console.assert(typeof Terraformer !== undefined);

let point = new Terraformer.Primitive({
  type: "Point",
  coordinates: [1, 2]
});

console.assert(point instanceof Terraformer.Point); // -> true
console.assert(point instanceof Terraformer.Primitive); // -> true

// point.within(polygon); // -> true or false

let point1 = new Terraformer.Point({
  type: "Point",
  coordinates: [1, 2]
});

let point2 = new Terraformer.Point(1, 2);

let point3 = new Terraformer.Point([1, 2]);

let linestring = new Terraformer.LineString({
  type: "LineString",
  coordinates: [[1, 2], [2, 1]]
});

linestring = new Terraformer.LineString([[1, 2], [2, 1]]);

let multilinestring = new Terraformer.MultiLineString({
  type: "MultiLineString",
  coordinates: [[[1, 2], [2, 1]]]
});

multilinestring = new Terraformer.MultiLineString([[[1, 1], [2, 2], [3, 4]], [[0, 1], [0, 2], [0, 3]]]);

let polygon1 = new Terraformer.Polygon({
  type: "Polygon",
  coordinates: [
    [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
    [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
  ]
});

let polygon2 = new Terraformer.Polygon([
  [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
  [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
]);

let multipolygon1 = new Terraformer.MultiPolygon({
  type: "MultiPolygon",
  coordinates: [[
    [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
    [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
  ]]
});

let multipolygon2 = new Terraformer.MultiPolygon([
  [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
  [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
]);

let feature1 = new Terraformer.Feature<GeoJSON.Polygon>({
  type: "Feature",
  properties: null,
  geometry: {
    type: "Polygon",
    coordinates: [
      [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
      [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
    ]
  }
});

let feature2 = new Terraformer.Feature({
  type: "Polygon",
  coordinates: [
    [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
    [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
  ]
});

let featurecollection1 = new Terraformer.FeatureCollection({
  type: "FeatureCollection",
  features: [feature1, feature2]
});

let featurecollection2 = new Terraformer.FeatureCollection([feature1, feature2]);

let geometrycollection1 = new Terraformer.GeometryCollection({
  type: "GeometryCollection",
  geometries: [point2, polygon1]
});

let geometrycollection2 = new Terraformer.GeometryCollection([point2, polygon1]);

let circle = new Terraformer.Circle([45.65, -122.27], 500, 64);

circle.contains(point1);

let pt = [-111.467285, 40.75766];
let pt2 = [-111.873779, 40.647303];

let polygon = {
  type: "Polygon",
  coordinates: [[
    [-112.074279, 40.52215],
    [-112.074279, 40.853293],
    [-111.610107, 40.853293],
    [-111.610107, 40.52215],
    [-112.074279, 40.52215]
  ]]
};

let polygonGeometry = polygon.coordinates;

Terraformer.Tools.polygonContainsPoint(polygonGeometry, pt);
// returns false
Terraformer.Tools.polygonContainsPoint(polygonGeometry, pt2);
// returns true