"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var actionTypes = {
    equals: "",
    element: "~",
    start: "^",
    end: "$",
    any: "*",
    not: "!",
    hyphen: "|"
};
var simpleSelectors = {
    child: " > ",
    parent: " < ",
    sibling: " ~ ",
    adjacent: " + ",
    descendant: " ",
    universal: "*"
};
function stringify(token) {
    return token.map(stringifySubselector).join(", ");
}
exports.default = stringify;
function stringifySubselector(token) {
    return token.map(stringifyToken).join("");
}
function stringifyToken(token) {
    if (token.type in simpleSelectors)
        return simpleSelectors[token.type];
    if (token.type === "tag")
        return escapeName(token.name);
    if (token.type === "pseudo-element")
        return "::" + escapeName(token.name);
    if (token.type === "attribute") {
        if (token.action === "exists") {
            return "[" + escapeName(token.name) + "]";
        }
        if (token.name === "id" &&
            token.action === "equals" &&
            !token.ignoreCase) {
            return "#" + escapeName(token.value);
        }
        if (token.name === "class" &&
            token.action === "element" &&
            !token.ignoreCase) {
            return "." + escapeName(token.value);
        }
        var atributeName = escapeName(token.name);
        var action = actionTypes[token.action];
        var value = escapeName(token.value);
        var ignoreCase = token.ignoreCase ? "i" : "";
        return "[" + atributeName + action + "='" + value + "'" + ignoreCase + "]";
    }
    if (token.type === "pseudo") {
        if (token.data === null)
            return ":" + escapeName(token.name);
        if (typeof token.data === "string") {
            return ":" + escapeName(token.name) + "(" + token.data + ")";
        }
        return ":" + escapeName(token.name) + "(" + stringify(token.data) + ")";
    }
    throw new Error("Unknown type");
}
function escapeName(str) {
    //TODO
    return str;
}