/*
 *
 *  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.
 *
 */

package org.apache.flex.compiler.utils;

/**
 * @author Michael Schmalle
 */
public class NativeUtils
{
    public enum NativeASType
    {
        Any("*"), // not JS but use full in the context of native

        Argument("Argument"),
        Array("Array"),
        Boolean("Boolean"),
        Class("Class"),
        Date("Date"),
        Error("Error"),
        EvalError("EvalError"),
        Function("Function"),
        Infinity("Infinity"),
        Math("Math"),
        JSON("JSON"),
        NaN("NaN"),
        Namespace("Namespace"),
        Number("Number"),
        Object("Object"),
        QName("QName"),
        RangeError("RangeError"),
        ReferenceError("ReferenceError"),
        RegExp("RegExp"),
        String("String"),
        SyntaxError("SyntaxError"),
        TypeError("TypeError"),
        URIError("URIError"),
        Vector("Vector"),
        XML("XML"),
        XMLList("XMLList"),
        _assert("assert"),
        decodeURI("decodeURI"),
        decodeURIComponent("decodeURIComponent"),
        encodeURI("encodeURI"),
        encodeURIComponent("encodeURIComponent"),
        escape("escape"),
        _int("int"),
        isFinite("isFinite"),
        isNaN("isNaN"),
        isXMLName("isXMLName"),
        parseFloat("parseFloat"),
        parseInt("parseInt"),
        trace("trace"),
        uint("uint"),
        undefined("undefined"),
        unescape("unescape");

        private final String value;

        NativeASType(String value)
        {
            this.value = value;
        }

        public String getValue()
        {
            return value;
        }
    }

    public enum NativeJSType
    {
        // (erikdebruin) Ref.: https://cwiki.apache.org/confluence/display/FLEX/Full+Table
        
        NaN("NaN"),
        Event("Event"),
        Array("Array"),
        Float32Array("Float32Array"),
        Float64Array("Float64Array"),
        Int8Array("Int8Array"),
        Int16Array("Int16Array"),
        Int32Array("Int32Array"),
        Uint8Array("Uint8Array"),
        Uint8ClampedArray("Uint8ClampedArray"),
        Uint16Array("Uint16Array"),
        Uint32Array("Uint32Array"),
        Date("Date"),
        Math("Math"),
        Error("Error"),
        RangeError("RangeError"),
        Boolean("Boolean"),
        decodeURI("decodeURI"),
        decodeURIComponent("decodeURIComponent"),
        encodeURI("encodeURI"),
        encodeURIComponent("encodeURIComponent"),
        escape("escape"),
        isFinite("isFinite"),
        isNaN("isNaN"),
        Number("Number"),
        Object("Object"),
        parseFloat("parseFloat"),
        parseInt("parseInt"),
        String("String"),
        undefined("undefined"),
        unescape("unescape"),
        window("window"),

        // (erikdebruin) These aren't strictly 'native' to JS, but the 
        //               Publisher provides global functions, so, for all 
        //               intends and purposes they behave like they are.
        _int("int"),
        trace("trace"),
        uint("uint"),
        
        // (erikdebruin) These are left out, but should, at some point, be
        //               treated as if they actually are 'native'.
        /*
        isXMLName("isXMLName"),
        Vector("Vector"),
        XML("XML"),
        XMLList("XMLList"),
        */
        
        _byte("byte"),
        
        ;
        private final String value;

        NativeJSType(String value)
        {
            this.value = value;
        }

        public String getValue()
        {
            return value;
        }
    }
    
    public static boolean isNative(String type)
    {
        for (NativeASType test : NativeASType.values())
        {
            if (test.getValue().equals(type))
                return true;
        }
        if (type.startsWith("Vector.<"))
            return true;
        return false;
    }

    public static boolean isJSNative(String type)
    {
        for (NativeJSType test : NativeJSType.values())
        {
            if (test.getValue().equals(type))
                return true;
        }
        return false;
    }

}
