"use strict";
var validateNames = require("./helpers/validate-names");

module.exports = function (core) {
  core.DOMImplementation.prototype.hasFeature = function () {
    return true;
  };

  core.DOMImplementation.prototype.createDocumentType = function (qualifiedName, publicId, systemId) {
    qualifiedName = String(qualifiedName);
    publicId = String(publicId);
    systemId = String(systemId);

    validateNames.qname(qualifiedName, core);

    return new core.DocumentType(this._ownerDocument, qualifiedName, publicId, systemId);
  };

  core.DOMImplementation.prototype.createDocument = function (namespace, qualifiedName, doctype) {
    namespace = namespace !== null ? String(namespace) : namespace;
    qualifiedName = qualifiedName === null ? "" : String(qualifiedName);
    if (doctype === undefined) {
      doctype = null;
    }

    var document = new core.Document({ parsingMode: "xml" });

    var element = null;
    if (qualifiedName !== "") {
      element = document.createElementNS(namespace, qualifiedName);
    }

    if (doctype !== null) {
      document.appendChild(doctype);
    }

    if (element !== null) {
      document.appendChild(element);
    }

    return document;
  };

  core.DOMImplementation.prototype.createHTMLDocument = function (title) {
    // Let doc be a new document that is an HTML document.
    // Set doc's content type to "text/html".
    var document = new core.HTMLDocument({ parsingMode: "html" });

    // Create a doctype, with "html" as its name and with its node document set
    // to doc. Append the newly created node to doc.
    var doctype = this.createDocumentType("html", "", "");
    document.appendChild(doctype);

    // Create an html element in the HTML namespace, and append it to doc.
    var htmlElement = document.createElementNS("http://www.w3.org/1999/xhtml", "html");
    document.appendChild(htmlElement);

    // Create a head element in the HTML namespace, and append it to the html
    // element created in the previous step.
    var headElement = document.createElement("head");
    htmlElement.appendChild(headElement);

    // If the title argument is not omitted:
    if (title !== undefined) {
      // Create a title element in the HTML namespace, and append it to the head
      // element created in the previous step.
      var titleElement = document.createElement("title");
      headElement.appendChild(titleElement);

      // Create a Text node, set its data to title (which could be the empty
      // string), and append it to the title element created in the previous step.
      titleElement.appendChild(document.createTextNode(title));
    }

    // Create a body element in the HTML namespace, and append it to the html
    // element created in the earlier step.
    htmlElement.appendChild(document.createElement("body"));

    // doc's origin is an alias to the origin of the context object's associated
    // document, and doc's effective script origin is an alias to the effective
    // script origin of the context object's associated document.

    return document;
  };
};
