#!/usr/bin/env node

/*
 *  Copyright 2011 Twitter, Inc.
 *  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 hogan = require('../lib/hogan.js'),
    path = require('path'),
    fs = require('fs');

var specials = ['/', '.', '*', '+', '?', '|','(', ')', '[', ']', '{', '}', '\\'],
    specialsRegExp = new RegExp('(\\' + specials.join('|\\') + ')', 'g'),
    templates;


// Escape special regexp characters
function esc(text) {
  return text.replace(specialsRegExp, '\\$1');
}


// Check for dirs and correct ext (<3 for windows)
function extractFiles(args) {
  var usage = 'USAGE: hulk ./templates/*.mustaches\n' +
              'NOTE:  hulk supports the "*" wildcard and allows you to target specific extensions too',
      files = [];

  if (!args.length) {
    console.log(usage);
    process.exit(-1);
  }

  args.forEach(function (arg) {

    if (/\*/.test(arg)) {
      arg = arg.split('*');
      return files = files.concat(
        fs.readdirSync(arg[0] || '.')
          .map(function (f) {
            return new RegExp(esc(arg[1]) + '$').test(f) && path.join(arg[0], f);
          })
          .filter(function (f) {
            return f;
          })
      );
    }

    files.push(arg);

  })

  return files;
}


// Remove utf-8 byte order mark, http://en.wikipedia.org/wiki/Byte_order_mark
function removeByteOrderMark(text) {
  if (text.charCodeAt(0) === 0xfeff) {
    return text.substring(1);
  }
  return text;
}


// Write a template foreach file that matches template extension
templates = extractFiles(process.argv.slice(2))
  .map(function (file) {
    var openedFile = fs.readFileSync(file, 'utf-8'), name;
    if (!openedFile) return;
    name = file.replace(/\..*$/, '');
    openedFile = removeByteOrderMark(openedFile.trim());
    return 'templates.' + name + ' = new Hogan.Template(' + hogan.compile(openedFile, { asString: 1 }) + ');';
  })
  .filter(function (t) {
    return t;
  });


// Output templates
if (!templates.length) return;
console.log('var templates = {};');
console.log(templates.join('\n'));