/*
 * 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.openwhisk.runtime.java.action;

import java.time.*;

public class Debug {

    public static final String FG_RED = (char)27 + "[31m";
    public static final String  FG_GREEN   = (char)27 + "[32m";
    public static final String  FG_YELLOW  = (char)27 + "[33m";
    //public static final String  FG_BLUE    = (char)27 + "[34m";
    public static final String  FG_MAGENTA = (char)27 + "[35m";
    public static final String  FG_CYAN    = (char)27 + "[36m";
    public static final String  FG_LIGHT_GRAY  = (char)27 + "[37m";
    //public static final String  FG_WHITE   = (char)27 + "[97m";

    public static final String  FG_SUCCESS = FG_GREEN;
    public static final String  FG_INFO    = FG_LIGHT_GRAY;
    public static final String  FG_WARN    = FG_YELLOW;
    public static final String  FG_ERROR   = FG_RED;

    public static final String prefixFGColor = FG_CYAN;
    public static final String postfixFGColor = FG_MAGENTA;
    public static final String bodyFGColor = FG_INFO;
    public static final String defaultFGColor = FG_INFO;
    public static final String functionStartMarker = ">>> START: ";
    public static final String functionEndMarker = "<<< END: ";

    // int, rounding is OK
    public static final int NANO = 1000000;

    // CONTEXT
    private static String PACKAGE_PATH = "org.apache.openwhisk.runtime.java.action";
    private static int PACKAGE_PATH_LENGTH = PACKAGE_PATH.length()+1;
    private static String FQ_METHOD = "";
    private static String METHOD = "";
    private static long currentTime = 0;
    //private static long startTime = 0;
    //private static long stopTime = 0;

    private static long updateContext(){
        currentTime = System.nanoTime();
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        FQ_METHOD = stackTraceElements[4].toString();
        METHOD = FQ_METHOD.substring(PACKAGE_PATH_LENGTH);
        return currentTime;
    }

    private static String formatMessage(String prefix, String message, long startTime){
        StringBuilder sb = new StringBuilder();
        sb.append(prefixFGColor);
        sb.append(prefix);
        sb.append("[");
        sb.append(METHOD);
        sb.append("] ");
        sb.append(bodyFGColor);
        sb.append(message);
        sb.append(postfixFGColor);

        // append method elapsed time
        sb.append("time (");
        sb.append((currentTime)/NANO);
        sb.append(" msec)");

        if(startTime >= 0){
            sb.append(" elapsed (");
            sb.append((currentTime-startTime)/NANO);
            sb.append(" msec)");
        }

        sb.append(defaultFGColor);
        return sb.toString();
    }

    public static long start() { return start("");}

    public static long start(String msg) {
        currentTime = updateContext();
        String formattedMsg = formatMessage(functionStartMarker, msg, -1);
        System.out.println(formattedMsg);
        return currentTime;
    }

    public static long end() { return end("",-1);}
    public static long end(long startTime) { return end("", startTime);}

    public static long end(String msg, long startTime){
        currentTime = updateContext();
        String formattedMsg = formatMessage(functionEndMarker, msg, startTime);
        System.out.println(formattedMsg);
        return currentTime;
    }

}
