/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
import jsyaml from 'js-yaml'

/**
 * @requires nodeca/js-yaml
 * @constructor
 */
export function JsYamlParser() {
};

/** returns a YamlParseNode containing { doc, parent, children, start, end, result } */
/**
 *
 * @param {!string} input
 * @returns {YamlParseNode}
 */
JsYamlParser.prototype.parse = function (input) {
    /**
     * @type {YamlParseNode}
     */
    var rootNode, node;
    var l = function (event, state) {
        if (event === 'open') {
            node = new YamlParseNode(input, node, state);
        } else if (event == 'close') {
            node.close(state);
            if (node.parent) {
                node.parent.children.push(node);
                node = node.parent;
            } else {
                if (rootNode != null) throw 'doc should have only one root node';
                rootNode = node;
                node = null;
            }
        }
    };
    jsyaml.safeLoad(input, {listener: l});
    return rootNode;
};

/**
 * @typedef YamlParseNode
 * @type Object
 * @property {string} doc The original YAML document
 * @property {?YamlParseNode} parent This parse nodes parent
 */

/**
 *
 * @param {string} doc The original YAML document
 * @param {?YamlParseNode} parent
 * @param {object} state
 * @constructor
 */
export function YamlParseNode(doc, parent, state) {
    this.doc = doc;
    this.parent = parent;
    this.children = [];
    this.start = state.position;
    this.end = null;
    this.result = null;
    this.kind = null;
}

/**
 * @param {object} state
 */
YamlParseNode.prototype.close = function (state) {
    this.end = state.position;
    this.result = state.result;
    this.kind = state.kind;
};
