'use strict';

var Long = require('long');
var s2node = require('s2geometry-node');
var S2 = require('../src/s2geometry.js').S2;

var tests = [
  { 'name': 'Provo, UT'
  , 'lat': 40.2574448
  , 'lng': -111.7089464
  , 'key': ''
  , 'id': ''
  }
, { 'name': 'Startup Building'
  , 'lat': 40.2262363
  , 'lng': -111.6630927
  , 'key': ''
  , 'id': ''
  }
, { 'name': "Kyderman's"
  , 'lat': 51.352085106718384 // 51.352085106718384
  , 'lng': -2.9877930879592896 // -2.9877930879592896
  , 'key': ''
  , 'id': ''
  }
, { 'name': "Toeler's"
  , 'lat': -43.525166 // -43.5261282
  , 'lng': 172.655096 // 172.6561085
  , 'key': ''
  , 'id': ''
  }
/*
, { 'name': ""
  , 'lat': 0
  , 'lng': 0
  , 'key': ''
  , 'id': ''
  }
*/
];

// get known-expected values
tests.forEach(function (loc) {
  var level = 15;
  var s2nLatLng = new s2node.S2LatLng(loc.lat, loc.lng);
  var s2nId = new s2node.S2CellId(s2nLatLng).parent(level);
  var s2nCell = new s2node.S2Cell(s2nId);

  loc.face = s2nCell.face();
  loc.id = s2nId.id();
  loc.key = s2nId.toString();
  loc.lat = s2nId.toLatLng().toString().split(',')[0];
  loc.lng = s2nId.toLatLng().toString().split(',')[1];
  loc.level = s2nId.level(); // always 15
  loc.point = s2nId.toPoint()// .toArray();

  //console.log(JSON.stringify(loc, null, '  '));

  var key = S2.latLngToQuadkey(loc.lat, loc.lng, level);
  var id = S2.toId(key);
  var key2 = S2.toKey(id);
  var id2 = S2.toId(key2);

  if (loc.key !== key || loc.id !== id) {
    console.error("Error testing " + loc.name + " @ " + loc.lat + ',' + loc.lng);
    console.error("Calculated/Expected:");
    console.error(id, ':', loc.id);
    console.error(key, " : ", loc.key);
    console.error(loc.point.x(), loc.point.y(), loc.point.z());
    console.error(Long.fromString(id, true, 10).toString(2));
    console.error(Long.fromString(loc.id, true, 10).toString(2));

    throw new Error('Test Failed');
  }

  if (loc.key !== key2 || loc.id !== id2) {
    console.error("Error testing " + loc.name + " @ " + loc.lat + ',' + loc.lng);
    console.error("Secondary Key / ID conversion failed: Calculated/Expected:");
    console.error(id2, ':', loc.id);
    console.error(key2, " : ", loc.key);

    throw new Error('Test Failed');
  }
});