/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.core.log;

import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
import org.eclipse.osee.ote.core.MethodFormatter;
import org.eclipse.osee.ote.core.ReturnFormatter;
import org.eclipse.osee.ote.core.TestCase;
import org.eclipse.osee.ote.core.TestScript;
import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
import org.eclipse.osee.ote.core.log.record.AttentionRecord;
import org.eclipse.osee.ote.core.log.record.DebugRecord;
import org.eclipse.osee.ote.core.log.record.InfoRecord;
import org.eclipse.osee.ote.core.log.record.RequirementRecord;
import org.eclipse.osee.ote.core.log.record.SevereRecord;
import org.eclipse.osee.ote.core.log.record.SupportRecord;
import org.eclipse.osee.ote.core.log.record.TestPointRecord;
import org.eclipse.osee.ote.core.log.record.TestRecord;
import org.eclipse.osee.ote.core.log.record.TraceRecord;
import org.eclipse.osee.ote.core.log.record.TraceRecordEnd;
import org.eclipse.osee.ote.core.log.record.WarningRecord;

/**
 * @author Ryan D. Brooks
 * @author Robert A. Fisher
 * @author Andrew M. Finkbeiner
 * @author Charles Shaw
 */
public class TestLogger extends Logger implements ITestLogger {

   /**
    * TestLogger Constructor. Sets logging level and filter.
    */
   public TestLogger() {
      super("osee.test.core.log", null);
      setLevel(Level.ALL);
   }

   /**
    * For communicating with the user running an interactive script only allowed in interactive scripts (use sparingly).
    */
   public void attention(ITestEnvironmentAccessor source, String message) {
      // TODO: this is not just a straight log
      log(new AttentionRecord(source, message));
   }

   /**
    * Records a debugging message in the log. Will never be seen during demos.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param message The log message.
    */
   @Override
   public void debug(ITestEnvironmentAccessor source, String message) {
      log(new DebugRecord(source, message));
   }

   /**
    * Records a debugging message in the log. Will never be seen during the demos.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param message The log message.
    * @param timeStamp <b>True</b> if you want a time stamp included, <b>False</b> if you do not.
    */
   @Override
   public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp) {
      log(new DebugRecord(source, message, timeStamp));
   }

   /**
    * Records a warning message in the log.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param message The log message.
    */
   @Override
   public void warning(ITestEnvironmentAccessor source, String message) {
      log(new WarningRecord(source, message));
   }

   /**
    * Internal - logging from, say, guts of messaging API
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param message The log message.
    */
   @Override
   public void support(ITestEnvironmentAccessor source, String message) {
      log(new SupportRecord(source, message));
   }

   /**
    * Records a severe message in the log.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param message The log message.
    */
   @Override
   public void severe(ITestEnvironmentAccessor source, String message) {
      log(new SevereRecord(source, message));
   }

   /**
    * Records a severe message in the log.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    */
   @Override
   public void severe(Object source, Throwable thrown) {
      throwing(source.getClass().getName(), null, thrown);
   }

   @Override
   public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String exp, String act) {
      log(new TestPointRecord(env, script, testCase, testPointName, exp, act, passed));
   }

   @Override
   public void testpoint(TestPointRecord record) {
      log(record);
   }

   @Override
   public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint) {
      log(new TestPointRecord(env, script, testCase, testPoint));
   }

   /**
    * Records that a test case began in the log.
    * 
    * @param testCase The test case whose start is to be recorded.
    */
   @Override
   public void testCaseBegan(TestCase testCase) {
      log(testCase.getTestRecord());
   }

   /**
    * Record a trace event. Such as when a function starts or stops.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    */
   public void trace(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments) {
      log(new TraceRecord(source, objectName, methodName, methodArguments));
   }

   public void endtrace(ITestEnvironmentAccessor source, ReturnFormatter methodArguments) {
      log(new TraceRecordEnd(source, methodArguments));
   }

   /**
    * Record a requirement to the log.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param message The log message.
    */
   public void requirement(ITestEnvironmentAccessor source, String message) {
      log(new RequirementRecord(source, message));
   }

   /**
    * Log the beginning of a method with no arguments.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    */
   @Override
   public void methodCalled(ITestEnvironmentAccessor source) {
      methodCalled(source, new MethodFormatter(), 2);
   }

   /**
    * Log the beginning of a method with a formatted string holding the arguments.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param arguments The arguments in a formatted string.
    */
   @Override
   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments) {
      methodCalled(source, arguments, 2);
   }

   //   /**
   //    * Log the beginning of a method with a the MethodFormatter formatted argument object.
   //    *
   //    * @param source The object requesting the logging (Usually "this" is passed in).
   //    * @param methodFormat Reference to the MethodFormatter formatted argument list.
   //    */
   //   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter methodFormat) {
   //      methodCalled(source, methodFormat, 2);
   //   }

   /**
    * Log the beginning of a method.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param arguments The arguments in a formatted string.
    * @param methodCount The number of methods called to reach this point.
    */
   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments, int methodCount) {
      String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
      trace(source, "", methodName, arguments);
   }

   /**
    * Log the start of a method with the object variable name.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param objectName The class variable name.
    */
   @Override
   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName) {
      methodCalledOnObject(source, objectName, new MethodFormatter(), 2);
   }

   //   /**
   //    * Log the start of a method with the object variable name and a formatted string with the
   //    * arguments.
   //    *
   //    * @param source The object requesting the logging (Usually "this" is passed in).
   //    * @param objectName The class variable name.
   //    * @param arguments The arguments in a formatted string.
   //    */
   //   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments) {
   //      methodCalledOnObject(source, objectName, arguments, 2);
   //   }

   /**
    * Log the start of a method with the object variable name and a MethodFormatter formatted argument object.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param objectName The class variable name.
    * @param methodFormat Reference to the MethodFormatter formatted argument list.
    */
   @Override
   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat) {
      methodCalledOnObject(source, objectName, methodFormat, 2);
   }

   /**
    * Log the start of a method with the object variable name.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    * @param objectName The class variable name.
    * @param arguments The arguments in a formatted string.
    * @param methodCount The number of methods called to reach this point.
    */
   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments, int methodCount) {

      String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
      trace(source, objectName, methodName, arguments);
   }

   /**
    * Specifies that a method has ended. This must be paired with the methodBegin() call.
    * 
    * @param source The object requesting the logging (Usually "this" is passed in).
    */
   @Override
   public void methodEnded(ITestEnvironmentAccessor source) {
      endtrace(source, new ReturnFormatter());
   }

   @Override
   public void methodEnded(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter) {
      endtrace(source, returnFormatter);
   }

   @Override
   public void log(TestRecord record) {
      this.log((LogRecord) record);
   }

   @Override
   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject) {
      methodCalledOnObject(source, objectName, methodFormat, xmlObject, 2);
   }

   private void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject, int methodCount) {
      String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
      TraceRecord record = new TraceRecord(source, objectName, methodName, methodFormat, true);
      record.addAdditionalElement(xmlObject);
      if (xmlObject instanceof XmlizableStream) {
         record.addAdditionalElement((XmlizableStream) xmlObject);
      }
      log(record);
   }

   @Override
   public void log(ITestEnvironmentAccessor source, Level level, String message, Throwable th) {
      if(level.intValue() >= Level.SEVERE.intValue()){
         SevereRecord severe = new SevereRecord(source, message, true);
         severe.setThrown(th);
         this.log(severe);
      } else if (level.intValue() >= Level.WARNING.intValue()){
         WarningRecord warn = new WarningRecord(source, message, true);
         warn.setThrown(th);
         this.log(warn);
      } else if (level.intValue() >= Level.INFO.intValue()){
         InfoRecord info = new InfoRecord(source, message, true);
         info.setThrown(th);
         this.log(info);
      } else {
         this.log(level, message, th);
      }
   }

 
}