/*
 *
 *  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.royale.utils;

import java.util.Date;

/**
 * Primitive run-time tracing class.
 * <p>
 * Code as follows:
 * <pre>
 * if (Trace.foo)
 *     Trace.trace("trace msg"...);
 * </pre>
 * Enable as follows:
 * <p>
 * java -Dtrace.foo -Dtrace.foo2 -Dtrace.foo3 or -Dtrace.all
 * <p>
 * Special flags:<p>
 * -Dtrace.flex                -- enables all tracing<p>
 * -Dtrace.foo                   -- enables tracing on foo subsystem<p>
 * -Dtrace.timeStamp             -- timeStamp all output lines<p>
 * -Dtrace.caller                -- print the Class:method caller<p>
 * -Dtrace.stackLines=10         -- print 10 stack lines<p>
 * -Dtrace.stackPrefix=java.lang -- print the stack up to java.lang<p>
 * <p>
 * Add new xxx members as desired.
 */
public class Trace
{
    public static final boolean all = (System.getProperty("trace.flex") != null);
    
    public static final boolean phase = all || (System.getProperty("trace.phase") != null);
    public static final boolean phaseabc = all || (System.getProperty("trace.phaseabc") != null); 
    //public static final boolean phasex = all || (System.getProperty("trace.phasex") != null);
    
    //public static final boolean asc = all || (System.getProperty("trace.asc") != null);
    public static final boolean accessible = all || (System.getProperty("trace.accessible") != null);
	public static final boolean asdoc = all || (System.getProperty("trace.asdoc") != null);		
    //public static final boolean benchmark = all || (System.getProperty("trace.benchmark") != null);
    public static final boolean cache = all || (System.getProperty("trace.cache") != null);
    //public static final boolean compileTime = all || (System.getProperty("trace.compileTime") != null);
    public static final boolean css = all || (System.getProperty("trace.css") != null);
    public static final boolean dependency = all || (System.getProperty("trace.dependency") != null);
    public static final boolean config = all || (System.getProperty("trace.config") != null);
    public static final boolean embed = all || (System.getProperty("trace.embed") != null);
    //public static final boolean embedx = all || (System.getProperty("trace.embedx") != null);
    public static final boolean error = all || (System.getProperty("trace.error") != null);
    public static final boolean font = all || (System.getProperty("trace.font") != null);
    public static final boolean font_cubic = all || (System.getProperty("trace.font.cubic") != null);
    //public static final boolean image = all || (System.getProperty("trace.image") != null);
    //public static final boolean lib = all || (System.getProperty("trace.lib") != null);
    public static final boolean license = all || (System.getProperty("trace.license") != null);
    //public static final boolean linker = all || (System.getProperty("trace.linker") != null);
    public static final boolean mxml = all || (System.getProperty("trace.mxml") != null);
    //public static final boolean parser = all || (System.getProperty("trace.parser") != null);
    public static final boolean profiler = all || (System.getProperty("trace.profiler") != null);
    //public static final boolean schema = all || (System.getProperty("trace.schema") != null);
    public static final boolean swc = all || (System.getProperty("trace.swc") != null);
    //public static final boolean swf = all || (System.getProperty("trace.swf") != null);
    public static final boolean pathResolver = all || (System.getProperty("trace.pathResolver") != null);
    public static final boolean binding = all || (System.getProperty("trace.binding") != null);

    // print just the stack caller
    public static final boolean caller = (System.getProperty("trace.caller") != null);
    // print stack up to the prefix
    public static final String stackPrefix = System.getProperty("trace.stackPrefix");

    // print this number of stack lines
    public static final int stackLines = getStackLines();
    private static int getStackLines()
    {
        int lines = 0;
        try {
            lines = Integer.parseInt(System.getProperty("trace.stackLines"));
        } catch (NumberFormatException e) {
        }
        return lines;
    }

    // print a timestamp with each line
    public static final boolean timeStamp = (System.getProperty("trace.timeStamp") != null);
    // print a timestamp on each line in milliseconds
    public static final boolean timeStampMs = (System.getProperty("trace.timeStampMs") != null);
    // print a timestamp on each line in "relative" millisconds (first print will be zero)
    public static final boolean timeStampMsRel = (System.getProperty("trace.timeStampMsRel") != null);
    
    // print debug information related to the swc-checksum option
    public static final boolean swcChecksum = all || (System.getProperty("trace.swcChecksum") != null);
    
    private static long t0=0; // used with timeStampMsRel
    /**
     * Write the string as a line to the trace stream. If the
     * "stack" property is enabled, then the caller's stack call
     * is also shown in the date.
     */
    public static void trace(String str) {
        if (timeStamp)
            System.err.print(new Date());
        
        if (timeStampMs || timeStampMsRel)
        {
        	if (timeStampMsRel && (t0 == 0))
        		t0 = System.currentTimeMillis();
        
        	System.err.print((System.currentTimeMillis() - t0) + " ");
        }

        if(caller)
            System.err.print(ExceptionUtil.getCallAt(new Throwable(), 1) + " ");

        System.err.println(str);

        if (stackLines > 0)
            System.err.println(ExceptionUtil.getStackTraceLines(new Throwable(), stackLines));
        else if (stackPrefix != null)
            System.err.println(ExceptionUtil.getStackTraceUpTo(new Throwable(), stackPrefix));
    }
    /** Reset the relative clock to zero
     * Only has an effect when -Dtrace.timeStampMsRel is enabled
     */
    public static void resetRel() {
    	trace("Relative clock will reset to zero");
    	t0 = 0;
    	trace("Relative clock new reset");	// print two message, so we have before and after time
    }

}

