/*
 * Copyright (C) 2016 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// Portable environment: one of ["node", "web", "worker", "shell"].
const _environment =
    ((typeof process === "object" && typeof require === "function") ? "node"
     : (typeof window === "object" ? "web"
        : (typeof importScripts === "function" ? "worker"
           : "shell")));

let _global = (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array)
    ? ((typeof self !== 'undefined') ? self
       : (typeof window !== 'undefined') ? window
       : (typeof global !== 'undefined') ? global
       : Function('return this')())
    : global;

const _eval = x => eval.call(null, x);

const _read = filename => {
    switch (_environment) {
    case "node":   return read(filename);
    case "web":    // fallthrough
    case "worker": let xhr = new XMLHttpRequest(); xhr.open("GET", filename, /*async=*/false); return xhr.responseText;
    case "shell":  return read(filename);
    }
}

const _load = filename => {
    switch (_environment) {
    case "node":   // fallthrough
    case "web":    // fallthrough
    case "shell":  return _eval(_read(filename));
    case "worker": return importScripts(filename);
    }
}

const _json = filename => {
    switch (_environment) {
    case "node":   // fallthrough
    case "shell":  return JSON.parse(_read(filename));
    case "web":    // fallthrough
    case "worker": let xhr = new XMLHttpRequest(); xhr.overrideMimeType("application/json"); xhr.open("GET", filename, /*async=*/false); return xhr.response;
    }
}

const _dump = (what, name, pad = '    ') => {
    const value = v => {
        try { return `"${v}"`; }
        catch (e) { return `Error: "${e.message}"`; }
    };
    let s = `${pad}${name} ${typeof what}: ${value(what)}`;
    for (let p in what) {
        s += `\n${pad}${pad}${p}: ${value(what[p])} ${typeof v}`;
        s += '\n' + _dump(what[p], p, pad + pad);
    }
    return s;
};

export const toJavaScriptName = name => {
    const camelCase = name.replace(/([^a-z0-9].)/g, c => c[1].toUpperCase());
    const CamelCase = camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
    return CamelCase;
};

// Use underscore names to avoid clashing with builtin names.
export {
    _dump as dump,
    _eval as eval,
    _read as read,
    _load as load,
    _json as json,
    _global as global
};
