/**
 * Tput for node.js
 * Copyright (c) 2013, Christopher Jeffrey (MIT License)
 * https://github.com/chjj/blessed
 */

// Compile xterm terminfo/termcap:
// $ tic -a -I -1 usr/xterm.terminfo
// $ tic -a -C -U usr/xterm.termcap

// Compile xterm terminfo/termcap:
// $ tic -a -1 usr/xterm.terminfo
// $ tic -a -1 usr/xterm.terminfo && ls ~/.terminfo
// $ tic -a -1 -o usr usr/xterm.terminfo && mv usr/x/xterm usr/ && rm -rf usr/v usr/x
// $ tic -a -1 -o usr usr/xterm.terminfo && mv usr/x/xterm-256color usr/ && rm -rf usr/v usr/x

// Check tput output:
// $ node test/tput.js xterm | tee out
// $ node test/tput.js xterm --ifile usr/xterm | tee out
// $ node test/tput.js xterm-256color --ifile usr/xterm-256color | tee out
// $ node test/tput.js vt102 --termcap | tee out
// $ node test/tput.js xterm --termcap --cfile usr/xterm.termcap | tee out
// $ node test/tput.js xterm --iprefix ~/.terminfo | tee out
// $ node test/tput.js xterm-256color --ifile ~/.terminfo/x/xterm-256color | tee out
// $ cdiff test/terminfo out

var blessed = require('../');

// Simple argument parser
// Copyright (c) 2012, Christopher Jeffrey (MIT License)

function parseArg() {
  var argv = process.argv.slice(2)
    , options = [];

  function getarg() {
    var arg = argv.shift();

    if (arg.indexOf('--') === 0) {
      // e.g. --opt
      arg = arg.split('=');
      if (arg.length > 1) {
        // e.g. --opt=val
        argv.unshift(arg.slice(1).join('='));
      }
      arg = arg[0];
    } else if (arg[0] === '-') {
      if (arg.length > 2) {
        // e.g. -abc
        argv = arg.substring(1).split('').map(function(ch) {
          return '-' + ch;
        }).concat(argv);
        arg = argv.shift();
      } else {
        // e.g. -a
      }
    } else {
      // e.g. foo
    }

    return arg;
  }

  while (argv.length) {
    arg = getarg();
    if (arg.indexOf('-') === 0) {
      arg = arg.replace(/^--?/, '');
      if (argv[0] && argv[0].indexOf('-') !== 0) {
        options[arg] = argv.shift();
      } else {
        options[arg] = true;
      }
    } else {
      options.push(arg);
    }
  }

  return options;
}

var argv = parseArg();

var tput = blessed.tput({
  term: argv[0] !== 'all' && argv[0] !== 'rand'
    ? argv[0] || __dirname + '/../usr/xterm'
    : null,
  extended: true,
  debug: true,
  termcap: argv.termcap,
  terminfoFile: argv.i || argv.ifile,
  terminfoPrefix: argv.p || argv.iprefix,
  termcapFile: argv.c || argv.cfile
});

if (argv[0] === 'all') {
  var rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
  });

  var text = '\x1b[31mWARNING:\x1b[m '
    + 'This will compile every single terminfo file on your disk.\n'
    + 'It will probably use a lot of CPU.\n'
    + 'Do you wish to proceed? (Y/n) ';

  rl.question(text, function(result) {
    result = result.trim().toLowerCase();
    if (result !== 'y') return process.exit(0);
    console.log('\x1b[32m(You bet your ass I wish to proceed.)\x1b[m');
    // tput._write('$<1000/>.$<1000/>.$<1000/>.$<100/>Let\'s go...',
    //   process.stdout.write.bind(process.stdout),
    //   function() {});
    setTimeout(function() { process.stdout.write('.'); }, 1000);
    setTimeout(function() { process.stdout.write('.'); }, 2000);
    setTimeout(function() { process.stdout.write('.'); }, 3000);
    setTimeout(function() { console.log('Let\'s go...'); }, 3100);
    setTimeout(function() {
      tput.compileAll(argv[1]);
      process.exit(0);
    }, 4000);
  });

  return;
}

if (argv[0] === 'rand') {
  var terms = tput.getAll()
    , term;

  term = terms[(terms.length - 1) * Math.random() | 0];

  console.log('Compiling ' + term + '...');
  tput.compileTerminfo(term);
  console.log('Compiled ' + term + '.');

  return;
}

// console.log('Max colors: %d.', tput.colors);

// console.log(tput.strings.acs_chars.split('').map(function(ch) { return ch.charCodeAt(0); }));
// console.log(JSON.stringify(tput.strings.acs_chars));

// process.stdout.write(blessed.tput.sprintf('%-10s\n', 'hello'));

// tput._compile({ name: 'xterm' }, 'set_attributes',
//   '%?%p9%t\u001b(0%e\u001b(B%;\u001b[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m');

// console.log(tput.setaf(4) + 'foo' + tput.sgr0());
// console.log(tput.setaf(4) + 'foo' + tput.sgr(0));

// tput.padding = true;
// tput._print('hello$<1000/>world', console.log, function() {
//   tput._print('$<1000/>foo$<1000/>bar', console.log, process.exit);
// });
