/*******************************************************************************
 * Copyright (c) 2019 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.ote.simple.test.environment.outfile;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterPrettyPrint;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.ote.core.environment.TestEnvironment;
import org.eclipse.osee.ote.core.log.record.ScriptInitRecord;
import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
import org.eclipse.osee.ote.core.log.record.TestCaseRecord;
import org.eclipse.osee.ote.core.log.record.TestRecord;
import org.eclipse.osee.ote.core.log.record.TraceRecordEnd;

/**
 * @author Andrew M. Finkbeiner
 * @author Andy Jury
 */
public class ScriptStreamOutLogHandler extends Handler {
   private final List<LogRecord> records;
   private OutputStream outputStream;
   private XMLStreamWriter writer;

   public ScriptStreamOutLogHandler(File outFile, String distributionStatement) {
      super();
      records = new ArrayList<LogRecord>();
      try {
         outputStream = new BufferedOutputStream(new FileOutputStream(outFile), 8192 * 16);
         XMLOutputFactory factory = XMLOutputFactory.newInstance();
         writer = new XMLStreamWriterPrettyPrint(factory.createXMLStreamWriter(outputStream));
         writer.writeStartDocument("1.0");
         writer.writeComment(distributionStatement);
         writer.writeStartElement("TestScript");
         OseeLog.log(TestEnvironment.class, Level.FINE, outFile.getAbsolutePath());
      } catch (FileNotFoundException ex) {
         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
      } catch (XMLStreamException ex) {
         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
      }
   }

   public ScriptStreamOutLogHandler(File outFile) {
      this(outFile, "DISTRO_STATEMENT_HERE");
   }

   public String getXSLTransformName() {
      return "outputNormal.xsl";
   }

   @Override
   public synchronized void publish(LogRecord logRecord) {
      if (isLoggable(logRecord)) {
         records.add(logRecord);
      }
   }

   public synchronized void flushRecords() {
      boolean started = false;
      try {
         for (int i = 0; i < records.size(); i++) {
            LogRecord logRecord = records.get(i);

            if (logRecord instanceof TestRecord) {
               TestRecord record = (TestRecord) logRecord;

               if (record instanceof ScriptInitRecord) {
                  if (!((ScriptInitRecord) record).getStartFlag()) {
                     continue;
                  }
               }

               if (!started && isTopLevelElement(record)) {
                  started = true;
                  record.toXml(writer);
               } else if (isTopLevelElement(record)) {
                  writer.writeEndElement();
                  record.toXml(writer);
               } else if (record instanceof TraceRecordEnd) {
                  record.toXml(writer);
                  writer.writeEndElement();
               } else {
                  record.toXml(writer);
               }
            } else {
               writer.writeStartElement("OteLog");
               writer.writeAttribute("Level", logRecord.getLevel().getLocalizedName());
               writer.writeAttribute("Logger", logRecord.getLoggerName());
               writer.writeStartElement("Message");
               writer.writeCharacters(logRecord.getMessage());
               writer.writeEndElement();
               if (logRecord.getThrown() != null) {
                  StringWriter sw = new StringWriter();
                  PrintWriter pw = new PrintWriter(sw);
                  logRecord.getThrown().printStackTrace(pw);
                  pw.close();
                  writer.writeStartElement("Throwable");
                  writer.writeCharacters(sw.toString());
                  writer.writeEndElement();
               }
               writer.writeEndElement();
            }
         }
      } catch (XMLStreamException ex) {
         OseeLog.log(ScriptStreamOutLogHandler.class, Level.SEVERE, ex);
      } finally {
         try {
            writer.writeEndDocument();
         } catch (XMLStreamException ex) {
            OseeLog.log(ScriptStreamOutLogHandler.class, Level.SEVERE, ex);
         }
         records.clear();
      }
   }

   private boolean isTopLevelElement(TestRecord record) {
      return record instanceof TestCaseRecord || record instanceof ScriptResultRecord || record instanceof ScriptInitRecord;
   }

   @Override
   public void close() throws SecurityException {
      try {
         writer.flush();
         writer.close();
         outputStream.close();
      } catch (IOException ex) {
         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
      } catch (XMLStreamException ex) {
         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
      }
   }

   @Override
   public void flush() {
      // don't call this method
   }
}