(function (app) {
    'use strict';

    function create(schema, ui, path, value, options) {
        options = options || {};
        if (!schema) {
            return app.modules.widgets.makePrimitive({ type: 'string' }, ui, path, value, options);
        }
        const t = schema.type;
        if (t === 'object') {
            return app.modules.object.makeObject(schema, ui, path, value, options);
        }
        if (t === 'array') {
            return app.modules.array.makeArray(schema, ui, path, value, options);
        }
        // Anything else (string, number, integer, boolean, enum) falls through
        // to the primitive widget which dispatches on schema.type / schema.enum.
        return app.modules.widgets.makePrimitive(schema, ui, path, value, options);
    }

    function mount(rootEl, schema, ui, data) {
        const widget = create(schema, ui, '', data, { fieldName: '', required: false });
        rootEl.appendChild(widget.el);
        return widget;
    }

    app.modules.render = { create: create, mount: mount };
})(window.formApp);
