'use strict'
var directiveParser = require('./directive-parser.js')
module.exports = {
  stack: [],
  pop: function (current) {
    var index = this.stack.indexOf(current)
    if (index !== -1) {
      this.stack.splice(index, 1)
    }
    if (!current.preserve) {
      current.source.remove()
    }
  },
  parse: function (node, lazyResult, callback) {
    var current
    var metadata = directiveParser(node)
    if (metadata) {
      if (!metadata.begin && metadata.end) {
        this.walk(function (item) {
          if (metadata.name === item.metadata.name) {
            this.pop(item)
            current = {'metadata': metadata, 'directive': item.directive, 'source': node, 'preserve': item.preserve}
            return false
          }
        }.bind(this))
      } else {
        current = {'metadata': metadata, 'directive': null, 'source': node, 'preserve': null}
      }

      if (current === undefined) {
        lazyResult.warn('found end "' + metadata.name + '" without a matching begin.', {node: node})
      } else if (callback(current)) {
        this.stack.push(current)
      } else if (!current.preserve) {
        current.source.remove()
      }
    }
  },
  walk: function (callback) {
    var len = this.stack.length
    while (--len > -1) {
      if (!callback(this.stack[len])) {
        break
      }
    }
  }
}