/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.
 */
var thrift = require('thrift');
//var ttransport = require('transport');
var assert = require('assert');

var ThriftTest = require('./gen-nodejs/ThriftTest'),
    ttypes = require('./gen-nodejs/ThriftTest_types');

//var connection = thrift.createConnection('localhost', 9090, { 'transport': ttransport.TFramedTransport }),
var connection = thrift.createConnection('localhost', 9090),
    client = thrift.createClient(ThriftTest, connection);

connection.on('error', function(err) {
  assert(false, err);
});

 // deepEqual doesn't work with fields using node-int64
function checkRecursively(map1, map2) {
  if (typeof map1 !== 'function' && typeof map2 !== 'function') {
    if (!map1 || typeof map1 !== 'object') {
        assert.equal(map1, map2);
    } else {
      for (var key in map1) {
        checkRecursively(map1[key], map2[key]);
      }
    }
  }
}


client.testVoid(function(err, response) {
  assert( ! err);
  assert.equal(undefined, response); //void
});


client.testString("Test", function(err, response) {
  assert( ! err);
  assert.equal("Test", response);
});

client.testString("", function(err, response) {
  assert( ! err);
  assert.equal("", response);
});

// all Languages in UTF-8
var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
client.testString(stringTest, function(err, response) {
  assert( ! err);
  assert.equal(stringTest, response);
});

var specialCharacters = 'quote: \" backslash:' +
    ' forwardslash-escaped: \/ ' +
    ' backspace: \b formfeed: \f newline: \n return: \r tab: ' +
    ' now-all-of-them-together: "\\\/\b\n\r\t' +
    ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><';
client.testString(specialCharacters, function(err, response) {
  assert( ! err);
  assert.equal(specialCharacters, response);
});


client.testByte(1, function(err, response) {
  assert( ! err);
  assert.equal(1, response);
});
client.testByte(0, function(err, response) {
  assert( ! err);
  assert.equal(0, response);
});
client.testByte(-1, function(err, response) {
  assert( ! err);
  assert.equal(-1, response);
});
client.testByte(-127, function(err, response) {
  assert( ! err);
  assert.equal(-127, response);
});

client.testI32(-1, function(err, response) {
  assert( ! err);
  assert.equal(-1, response);
});

client.testI64(5, function(err, response) {
  assert( ! err);
  assert.equal(5, response);
});
client.testI64(-5, function(err, response) {
  assert( ! err);
  assert.equal(-5, response);
});
client.testI64(-34359738368, function(err, response) {
  assert( ! err);
  assert.equal(-34359738368, response);
});

client.testDouble(-5.2098523, function(err, response) {
  assert( ! err);
  assert.equal(-5.2098523, response);
});
client.testDouble(7.012052175215044, function(err, response) {
  assert( ! err);
  assert.equal(7.012052175215044, response);
});


var out = new ttypes.Xtruct({
  string_thing: 'Zero',
  byte_thing: 1,
  i32_thing: -3,
  i64_thing: 1000000
});
client.testStruct(out, function(err, response) {
  assert( ! err);
  checkRecursively(out, response);
});


var out2 = new ttypes.Xtruct2();
out2.byte_thing = 1;
out2.struct_thing = out;
out2.i32_thing = 5;
client.testNest(out2, function(err, response) {
  assert( ! err);
  checkRecursively(out2, response);
});


var mapout = {};
for (var i = 0; i < 5; ++i) {
  mapout[i] = i-10;
}
client.testMap(mapout, function(err, response) {
  assert( ! err);
  assert.deepEqual(mapout, response);
});


var mapTestInput = {
  "a":"123", "a b":"with spaces ", "same":"same", "0":"numeric key",
  "longValue":stringTest, stringTest:"long key"
};
client.testStringMap(mapTestInput, function(err, response) {
  assert( ! err);
  assert.deepEqual(mapTestInput, response);
});


var setTestInput = [1,2,3];
client.testSet(setTestInput, function(err, response) {
  assert( ! err);
  assert.deepEqual(setTestInput, response);
});
client.testList(setTestInput, function(err, response) {
  assert( ! err);
  assert.deepEqual(setTestInput, response);
});

client.testEnum(ttypes.Numberz.ONE, function(err, response) {
  assert( ! err);
  assert.equal(ttypes.Numberz.ONE, response);
});

client.testTypedef(69, function(err, response) {
  assert( ! err);
  assert.equal(69, response);
});


var mapMapTest = {
  "4": {"1":1, "2":2, "3":3, "4":4},
  "-4": {"-4":-4, "-3":-3, "-2":-2, "-1":-1}
};
client.testMapMap(mapMapTest, function(err, response) {
  assert( ! err);
  assert.deepEqual(mapMapTest, response);
});

var crazy = new ttypes.Insanity({
  "userMap":{ "5":5, "8":8 },
  "xtructs":[new ttypes.Xtruct({
      "string_thing":"Goodbye4",
      "byte_thing":4,
      "i32_thing":4,
      "i64_thing":4
    }), new ttypes.Xtruct({
      "string_thing":"Hello2",
      "byte_thing":2,
      "i32_thing":2,
      "i64_thing":2
    })]
});
var insanity = {
  "1":{ "2": crazy, "3": crazy },
  "2":{ "6":{ "userMap":null, "xtructs":null } }
};
client.testInsanity(crazy, function(err, response) {
  assert( ! err);
  checkRecursively(insanity, response);
});


client.testException('TException', function(err, response) {
  //assert(err); //BUG?
  assert( ! response);
});
client.testException('Xception', function(err, response) {
  assert( ! response);
  assert.equal(err.errorCode, 1001);
  assert.equal('Xception', err.message);
});
client.testException('no Exception', function(err, response) {
  assert( ! err);
  assert.equal(undefined, response); //void
});


client.testOneway(1, function(err, response) {
  assert(false); //should not answer
});

/**
 * redo a simple test after the oneway to make sure we aren't "off by one" --
 * if the server treated oneway void like normal void, this next test will
 * fail since it will get the void confirmation rather than the correct
 * result. In this circumstance, the client will throw the exception:
 *
 *   TApplicationException: Wrong method namea
 */
client.testI32(-1, function(err, response) {
  assert( ! err);
  assert.equal(-1, response);
});

setTimeout(function() {
  console.log("Server successfully tested!");
  connection.end();
}, 200);

// to make it also run on expresso
exports.expressoTest = function() {};

