'use strict';

var Type = require('../../type');

function resolveJavascriptRegExp(data) {

if (data === null) return false;
if (data.length === 0) return false;

var regexp = data,
    tail   = /\/([gim]*)$/.exec(data),
    modifiers = '';

// if regexp starts with '/' it can have modifiers and must be properly closed
// `/foo/gim` - modifiers tail can be maximum 3 chars
if (regexp[0] === '/') {
  if (tail) modifiers = tail[1];

  if (modifiers.length > 3) return false;
  // if expression starts with /, is should be properly terminated
  if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;
}

return true;

}

function constructJavascriptRegExp(data) {

var regexp = data,
    tail   = /\/([gim]*)$/.exec(data),
    modifiers = '';

// `/foo/gim` - tail can be maximum 4 chars
if (regexp[0] === '/') {
  if (tail) modifiers = tail[1];
  regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
}

return new RegExp(regexp, modifiers);

}

function representJavascriptRegExp(object /*, style*/) {

var result = '/' + object.source + '/';

if (object.global) result += 'g';
if (object.multiline) result += 'm';
if (object.ignoreCase) result += 'i';

return result;

}

function isRegExp(object) {

return Object.prototype.toString.call(object) === '[object RegExp]';

}

module.exports = new Type('tag:yaml.org,2002:js/regexp', {

kind: 'scalar',
resolve: resolveJavascriptRegExp,
construct: constructJavascriptRegExp,
predicate: isRegExp,
represent: representJavascriptRegExp

});