// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

couchTests.elixir = true;
couchTests.reduce = function(debug) {
  return console.log('done in test/elixir/test/reduce_test.exs');
  var db_name = get_random_db_name();
  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
  db.createDb();
  if (debug) debugger;
  var numDocs = 500;
  var docs = makeDocs(1,numDocs + 1);
  db.bulkSave(docs);
  var summate = function(N) {return (N+1)*N/2;};

  var map = function (doc) {
      emit(doc.integer, doc.integer);
      emit(doc.integer, doc.integer);
  };
  var reduce = function (keys, values) { return sum(values); };
  var result = db.query(map, reduce);
  T(result.rows[0].value == 2*summate(numDocs));

  result = db.query(map, reduce, {startkey: 4, endkey: 4});
  T(result.rows[0].value == 8);

  result = db.query(map, reduce, {startkey: 4, endkey: 5});
  T(result.rows[0].value == 18);

  result = db.query(map, reduce, {startkey: 4, endkey: 6});
  T(result.rows[0].value == 30);

  result = db.query(map, reduce, {group:true, limit:3});
  T(result.rows[0].value == 2);
  T(result.rows[1].value == 4);
  T(result.rows[2].value == 6);

  for(var i=1; i<numDocs/2; i+=30) {
    result = db.query(map, reduce, {startkey: i, endkey: numDocs - i});
    T(result.rows[0].value == 2*(summate(numDocs-i) - summate(i-1)));
  }

  db.deleteDb();
  db_name = get_random_db_name();
  db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
  db.createDb();

  for(var i=1; i <= 5; i++) {

    for(var j=0; j < 10; j++) {
      // these docs are in the order of the keys collation, for clarity
      var docs = [];
      docs.push({keys:["a"]});
      docs.push({keys:["a"]});
      docs.push({keys:["a", "b"]});
      docs.push({keys:["a", "b"]});
      docs.push({keys:["a", "b", "c"]});
      docs.push({keys:["a", "b", "d"]});
      docs.push({keys:["a", "c", "d"]});
      docs.push({keys:["d"]});
      docs.push({keys:["d", "a"]});
      docs.push({keys:["d", "b"]});
      docs.push({keys:["d", "c"]});
      db.bulkSave(docs);
      var total_docs = ((i - 1) * 10 * 11) + ((j + 1) * 11);
      TEquals(total_docs, db.info().doc_count, "doc count should match");
    }

    map = function (doc) { emit(doc.keys, 1); };
    reduce = function (keys, values) { return sum(values); };

    var results = db.query(map, reduce, {group:true});

    //group by exact key match
    T(equals(results.rows[0], {key:["a"],value:20*i}));
    T(equals(results.rows[1], {key:["a","b"],value:20*i}));
    T(equals(results.rows[2], {key:["a", "b", "c"],value:10*i}));
    T(equals(results.rows[3], {key:["a", "b", "d"],value:10*i}));

    // test to make sure group reduce and limit params provide valid json
    var results = db.query(map, reduce, {group: true, limit: 2});
    T(equals(results.rows[0], {key: ["a"], value: 20*i}));
    T(equals(results.rows.length, 2));

    //group by the first element in the key array
    var results = db.query(map, reduce, {group_level:1});
    T(equals(results.rows[0], {key:["a"],value:70*i}));
    T(equals(results.rows[1], {key:["d"],value:40*i}));

    //group by the first 2 elements in the key array
    var results = db.query(map, reduce, {group_level:2});
    T(equals(results.rows[0], {key:["a"],value:20*i}));
    T(equals(results.rows[1], {key:["a","b"],value:40*i}));
    T(equals(results.rows[2], {key:["a","c"],value:10*i}));
    T(equals(results.rows[3], {key:["d"],value:10*i}));
    T(equals(results.rows[4], {key:["d","a"],value:10*i}));
    T(equals(results.rows[5], {key:["d","b"],value:10*i}));
    T(equals(results.rows[6], {key:["d","c"],value:10*i}));

    // endkey test with inclusive_end=true
    var results = db.query(map, reduce, {group_level:2,endkey:["d"],inclusive_end:true});
    T(equals(results.rows[0], {key:["a"],value:20*i}));
    T(equals(results.rows[1], {key:["a","b"],value:40*i}));
    T(equals(results.rows[2], {key:["a","c"],value:10*i}));
    T(equals(results.rows[3], {key:["d"],value:10*i}));
    TEquals(4, results.rows.length);

    // endkey test with inclusive_end=false
    var results = db.query(map, reduce, {group_level:2,endkey:["d"],inclusive_end:false});
    T(equals(results.rows[0], {key:["a"],value:20*i}));
    T(equals(results.rows[1], {key:["a","b"],value:40*i}));
    T(equals(results.rows[2], {key:["a","c"],value:10*i}));
    TEquals(3, results.rows.length);
  }

  // now test out more complex reductions that need to use the combine option.
  db.deleteDb();
  db_name = get_random_db_name();
  db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
  db.createDb();

  var map = function (doc) { emit(doc.val, doc.val); };
  var reduceCombine = function (keys, values, rereduce) {
      // This computes the standard deviation of the mapped results
      var stdDeviation=0.0;
      var count=0;
      var total=0.0;
      var sqrTotal=0.0;

      if (!rereduce) {
        // This is the reduce phase, we are reducing over emitted values from
        // the map functions.
        for(var i in values) {
          total = total + values[i];
          sqrTotal = sqrTotal + (values[i] * values[i]);
        }
        count = values.length;
      }
      else {
        // This is the rereduce phase, we are re-reducing previosuly
        // reduced values.
        for(var i in values) {
          count = count + values[i].count;
          total = total + values[i].total;
          sqrTotal = sqrTotal + values[i].sqrTotal;
        }
      }

      var variance =  (sqrTotal - ((total * total)/count)) / count;
      stdDeviation = Math.sqrt(variance);

      // the reduce result. It contains enough information to be rereduced
      // with other reduce results.
      return {"stdDeviation":stdDeviation,"count":count,
          "total":total,"sqrTotal":sqrTotal};
    };

    // Save a bunch a docs.

  for(var i=0; i < 10; i++) {
    var docs = [];
    docs.push({val:10});
    docs.push({val:20});
    docs.push({val:30});
    docs.push({val:40});
    docs.push({val:50});
    docs.push({val:60});
    docs.push({val:70});
    docs.push({val:80});
    docs.push({val:90});
    docs.push({val:100});
    db.bulkSave(docs);
  }

  var results = db.query(map, reduceCombine);

  var difference = results.rows[0].value.stdDeviation - 28.722813232690143;
  // account for floating point rounding error
  T(Math.abs(difference) < 0.0000000001);

  function testReducePagination() {
    var ddoc = {
      "_id": "_design/test",
      "language": "javascript",
      "views": {
        "view1": {
          "map": "function(doc) {" +
             "emit(doc.int, doc._id);" +
             "emit(doc.int + 1, doc._id);" +
             "emit(doc.int + 2, doc._id);" +
          "}",
          "reduce": "_count"
        }
      }
    };
    var result, docs = [];

    function randVal() {
        return Math.random() * 100000000;
    }

    db.deleteDb();
    db_name = get_random_db_name();
    db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
    db.createDb();

    for (var i = 0; i < 1123; i++) {
      docs.push({"_id": String(i), "int": i});
    }
    db.bulkSave(docs.concat([ddoc]));

    // ?group=false tests
    result = db.view('test/view1', {startkey: 400, endkey: 402, foobar: randVal()});
    TEquals(9, result.rows[0].value);
    result = db.view('test/view1', {startkey: 402, endkey: 400, descending: true,
      foobar: randVal()});
    TEquals(9, result.rows[0].value);

    result = db.view('test/view1', {startkey: 400, endkey: 402, inclusive_end: false,
      foobar: randVal()});
    TEquals(6, result.rows[0].value);
    result = db.view('test/view1', {startkey: 402, endkey: 400, inclusive_end: false,
      descending: true, foobar: randVal()});
    TEquals(6, result.rows[0].value);

    result = db.view('test/view1', {startkey: 400, endkey: 402, endkey_docid: "400",
      foobar: randVal()});
    TEquals(7, result.rows[0].value);
    result = db.view('test/view1', {startkey: 400, endkey: 402, endkey_docid: "400",
      inclusive_end: false, foobar: randVal()});
    TEquals(6, result.rows[0].value);

    result = db.view('test/view1', {startkey: 400, endkey: 402, endkey_docid: "401",
      foobar: randVal()});
    TEquals(8, result.rows[0].value);
    result = db.view('test/view1', {startkey: 400, endkey: 402, endkey_docid: "401",
      inclusive_end: false, foobar: randVal()});
    TEquals(7, result.rows[0].value);

    result = db.view('test/view1', {startkey: 400, endkey: 402, endkey_docid: "402",
      foobar: randVal()});
    TEquals(9, result.rows[0].value);
    result = db.view('test/view1', {startkey: 400, endkey: 402, endkey_docid: "402",
      inclusive_end: false, foobar: randVal()});
    TEquals(8, result.rows[0].value);

    result = db.view('test/view1', {startkey: 402, endkey: 400, endkey_docid: "398",
      descending: true, foobar: randVal()});
    TEquals(9, result.rows[0].value);
    result = db.view('test/view1', {startkey: 402, endkey: 400, endkey_docid: "398",
      descending: true, inclusive_end: false, foobar: randVal()}),
    TEquals(8, result.rows[0].value);

    result = db.view('test/view1', {startkey: 402, endkey: 400, endkey_docid: "399",
      descending: true, foobar: randVal()});
    TEquals(8, result.rows[0].value);
    result = db.view('test/view1', {startkey: 402, endkey: 400, endkey_docid: "399",
      descending: true, inclusive_end: false, foobar: randVal()}),
    TEquals(7, result.rows[0].value);

    result = db.view('test/view1', {startkey: 402, endkey: 400, endkey_docid: "400",
      descending: true, foobar: randVal()}),
    TEquals(7, result.rows[0].value);
    result = db.view('test/view1', {startkey: 402, endkey: 400, endkey_docid: "400",
      descending: true, inclusive_end: false, foobar: randVal()}),
    TEquals(6, result.rows[0].value);

    result = db.view('test/view1', {startkey: 402, startkey_docid: "400", endkey: 400,
      descending: true, foobar: randVal()});
    TEquals(7, result.rows[0].value);

    result = db.view('test/view1', {startkey: 402, startkey_docid: "401", endkey: 400,
      descending: true, inclusive_end: false, foobar: randVal()});
    TEquals(5, result.rows[0].value);

    // ?group=true tests
    result = db.view('test/view1', {group: true, startkey: 400, endkey: 402,
      foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(400, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(402, result.rows[2].key);
    TEquals(3, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, endkey: 400,
      descending: true, foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(400, result.rows[2].key);
    TEquals(3, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 400, endkey: 402,
      inclusive_end: false, foobar: randVal()});
    TEquals(2, result.rows.length);
    TEquals(400, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);

    result = db.view('test/view1', {group: true, startkey: 402, endkey: 400,
      descending: true, inclusive_end: false, foobar: randVal()});
    TEquals(2, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);

    result = db.view('test/view1', {group: true, startkey: 400, endkey: 402,
      endkey_docid: "401", foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(400, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(402, result.rows[2].key);
    TEquals(2, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 400, endkey: 402,
      endkey_docid: "400", foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(400, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(402, result.rows[2].key);
    TEquals(1, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, startkey_docid: "401",
      endkey: 400, descending: true, foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(2, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(400, result.rows[2].key);
    TEquals(3, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, startkey_docid: "400",
      endkey: 400, descending: true, foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(1, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(400, result.rows[2].key);
    TEquals(3, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, startkey_docid: "401",
      endkey: 400, descending: true, inclusive_end: false, foobar: randVal()});
    TEquals(2, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(2, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);

    result = db.view('test/view1', {group: true, startkey: 402, startkey_docid: "400",
      endkey: 400, descending: true, inclusive_end: false, foobar: randVal()});
    TEquals(2, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(1, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);

    result = db.view('test/view1', {group: true, startkey: 402, endkey: 400,
      endkey_docid: "398", descending: true, inclusive_end: true, foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(400, result.rows[2].key);
    TEquals(3, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, endkey: 400,
      endkey_docid: "399", descending: true, inclusive_end: true, foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(400, result.rows[2].key);
    TEquals(2, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, endkey: 400,
      endkey_docid: "399", descending: true, inclusive_end: false, foobar: randVal()});
    TEquals(3, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);
    TEquals(400, result.rows[2].key);
    TEquals(1, result.rows[2].value);

    result = db.view('test/view1', {group: true, startkey: 402, endkey: 400,
      endkey_docid: "400", descending: true, inclusive_end: false, foobar: randVal()});
    TEquals(2, result.rows.length);
    TEquals(402, result.rows[0].key);
    TEquals(3, result.rows[0].value);
    TEquals(401, result.rows[1].key);
    TEquals(3, result.rows[1].value);

    db.deleteDb();
  }

  testReducePagination();

  // cleanup
  db.deleteDb();
};
