/**
 ********************************************************************************
 * Copyright (c) 2017-2020 Robert Bosch GmbH and others.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */

package org.eclipse.app4mc.sca2amalthea.llvm.srcfiles.support;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.app4mc.sca.logging.manager.Logmanager;
import org.eclipse.app4mc.sca2amalthea.llvm.Activator;

/**
 * This class parses the build_cmd.log file which is typically located in _log/swb/module/build/build_cmds.log One
 * functionality is to get the list of compiled c-files. It could also be used to parse #define options. It is not the
 * best way since the logging format is not standardized. But for an intermediate solution it is a fast way.
 *
 */
public class BuildCommandLogFileParser implements ISourceFileListProvider {

  private final String buildCommandLogfilePath;
  private final String pverPath;

  /**
   * Constructor
   *
   * @param buildCommandLogfilePath path to the build_cmds.log file
   * @param projectPath path to the root directory of the PVER (project)
   */
  public BuildCommandLogFileParser(final String buildCommandLogfilePath, final String projectPath) {
    super();
    this.buildCommandLogfilePath = buildCommandLogfilePath;
    this.pverPath = projectPath;
  }

  /**
   * This method generates the list of c-Files from the build_cmds.log {@inheritDoc}
   */
  @Override
  public List<String> generateSourceFileList() {
    Set<String> cfileList = new LinkedHashSet<String>();

    try {
      BufferedReader inFileBuffer = new BufferedReader(new FileReader(this.buildCommandLogfilePath));
      String line;
      while ((line = inFileBuffer.readLine()) != null) {
        String cFileName = parseCFileName(line);
        if (cFileName != null) {
          // add c-File to the list, in the build_cmds.log the relative path is given, but we need the absolut path
          cfileList.add(this.pverPath + "/" + cFileName);
        }
      }
      inFileBuffer.close();
    }
    catch (IOException e) {
      Logmanager.getInstance().logException(this.getClass(), e, Activator.PLUGIN_ID);
      return new ArrayList<String>();
    }
    return new ArrayList<String>(cfileList);
  }

  private String parseCFileName(final String textLine) {
    // # Compiling source file [EnvSw/Startup/src/RBSYS/src/RBSYS_TimerSetup.c] (2/1.921)
    String patternString = ".*Compiling source file\\s\\[(.*c)\\].*";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(textLine);
    if (matcher.matches()) {
      return matcher.group(1);
    }
    return null;
  }

  /**
   * This method parses special #defines from the build options (e.g. -DSYSTEM_H="system.h")
   *
   * @return a list of -Doptions from the build log
   */
  public List<String> generateHashDefineList() {
    List<String> definesList = new ArrayList<String>();

    String patternString = "\\s+(-D\\w+=\\S+)+";
    Pattern hDefinePattern = Pattern.compile(patternString);
    String firstCompilePatternString = ".*Compiling source file.*";
    Pattern firstCompilePattern = Pattern.compile(firstCompilePatternString);

    try {
      BufferedReader inFileBuffer = new BufferedReader(new FileReader(this.buildCommandLogfilePath));
      String line;
      boolean firstCompileStatementFound = false;
      while ((line = inFileBuffer.readLine()) != null) {
        // Scan until the first compile line is found
        Matcher matcher = firstCompilePattern.matcher(line);
        if (!firstCompileStatementFound && matcher.matches()) {
          firstCompileStatementFound = true;
        }
        if (!firstCompileStatementFound) {
          continue;
        }

        matcher = hDefinePattern.matcher(line);
        while (matcher.find()) {
          definesList.add(matcher.group(1));
        }
        // just take the hash defines from the first occurence in the build_cmd.log
        if (!definesList.isEmpty()) {
          break;
        }
      }
      inFileBuffer.close();
    }
    catch (IOException e) {
      Logmanager.getInstance().logException(this.getClass(), e, Activator.PLUGIN_ID);
    }
    return definesList;
  }


}
