// 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.



var vm = require('vm');
var Fiber = require('fibers');

var XML = require('./xml');
var log = require('./console').log;

var INPUT = {
  'queue':[],
  'waiting':null
};

Error.prototype.toSource = Error.prototype.toSource || toSource;
Error.prototype.toString = Error.prototype.toString || toSource;
Function.prototype.toSource = Function.prototype.toSource || toSource;
Function.prototype.toString = Function.prototype.toString || toSource;


function print(line) {
  log('STDOUT %s: %s', process.pid, line);
  process.stdout.write(line + '\n');

  try {
    line = JSON.parse(line);
  } catch(er) {
    return;
  }

  if (line[0] === 'log') {
    log('LOG: %s', line[1]);
  }
}

function stdin (line) {
  log('STDIN %s: %s', process.pid, line.trim());

  if (INPUT.waiting) {
    INPUT.waiting.run(line);
  } else {
    INPUT.queue.push(line);
  }
}

function readline () {
  var line = INPUT.queue.shift();

  if (line) {
    return line;
  }

  INPUT.waiting = Fiber.current;
  line = Fiber.yield();
  INPUT.waiting = null;

  return line;
}


function evalcx (source, sandbox) {
  sandbox = sandbox || {};
  //log('evalcx in %j: %j', Object.keys(sandbox), source)

  if (source == '') {
    return sandbox;
  }

  // source might be "function(doc) { emit(doc._id, 1) }"
  source = source.replace(/;+$/, '');

  sandbox.XML = sandbox.XML || XML;
  source = '(' + source + ')';

  try {
    var id = Math.floor(Math.random() * 1000*1000);
    var filename = '_couchdb:' + id + '.js';
    var script = vm.createScript(source, filename);
    var func = script.runInNewContext(sandbox);
  } catch (er) {
    log('Error making code: %s', er.stack);
    return sandbox;
  }

  return func;
}

function quit(code) {
  code = code || 1;
  if (code < 0) {
    code = -code;
  }

  process.exit(code);
}

function gc() { }


function toSource() {
  if (typeof this == 'function') {
    return '' + this;
  }

  if (this instanceof Error) {
    return this.stack;
  }

  return util.inspect(this);
}

module.exports = {
  'print': print,
  'readline': readline,
  'stdin': stdin,
  'evalcx': evalcx,
  'quit': quit,
  'gc': gc
};

