/*******************************************************************************
 * Copyright (c) 2020 Bart Jacobs and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 */
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import org.eclipse.jdt.internal.compiler.parser.Parser;

public class GenerateParserScript {

	private static void assertTrue(boolean b) { if (!b) throw new AssertionError(); }

	public static void main(String[] args) throws IOException, InterruptedException {
		File grammarDir = new File("../grammar");
		File parserDir = new File("../compiler/org/eclipse/jdt/internal/compiler/parser");
		String jikespg = System.getProperty("JIKESPG");
		assertTrue(jikespg != null);

		if (!jikespg.equals("JIKESPG_EXTERNAL")) {
			// Run JikesPG
			Process process = Runtime.getRuntime().exec(new String[] {jikespg, "java.g"}, null, grammarDir);
			boolean ok = false;
			try (BufferedReader jikespgOutput = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
				for (;;) {
					String line = jikespgOutput.readLine();
					if (line == null)
						break;
					System.out.println(line);
					if (line.equals("This grammar is LALR(1)."))
						ok = true;
				}
			}
			int exitCode = process.waitFor();
			assertTrue(exitCode == 0);
			if (!ok)
				System.exit(1);
		}

		// Update parserNN.rsc and readableNames.props
		File javadclFile = new File(grammarDir, "javadcl.java");
		File javahdrFile = new File(grammarDir, "javahdr.java");
		Parser.buildFilesFromLPG(javadclFile.toString(), javahdrFile.toString());
		for (int i = 1; i <= 24; i++) {
			String filename = "parser"+i+".rsc";
			Files.move(new File(filename).toPath(), new File(parserDir, filename).toPath(), StandardCopyOption.REPLACE_EXISTING);
		}
		{
			String filename = "readableNames.props";
			Files.move(new File(filename).toPath(), new File(parserDir, filename).toPath(), StandardCopyOption.REPLACE_EXISTING);
		}

		// Update TerminalTokens.java
		File javasymFile = new File(grammarDir, "javasym.java");
		File terminalTokensFile = new File(parserDir, "TerminalTokens.java");
		String javasymText = new String(Files.readAllBytes(javasymFile.toPath())).replace("\r\n",  "\n");
		String terminalTokensText = new String(Files.readAllBytes(terminalTokensFile.toPath()));
		{
			String startTag = "// BEGIN_AUTOGENERATED_REGION\n";
			int start = terminalTokensText.indexOf(startTag);
			assertTrue(start >= 0);
			start += startTag.length();
			String terminalTokensProlog = terminalTokensText.substring(0, start);

			String javasymProlog =
					"interface javasym\n" + 
					"{\n" + 
					"    public final static int\n" +
					"      ";
			assertTrue(javasymText.startsWith(javasymProlog));
			javasymText = javasymText.substring(javasymProlog.length());
			javasymText = javasymText.replace(",\n      ", ",\n\t\t\t\t\t\t\t");
			javasymText = javasymText.replace("TokenName$eof", "TokenNameEOF");
			javasymText = javasymText.replace("TokenName$error", "TokenNameERROR");
			javasymText = javasymText.replace("TokenNamenon-sealed", "TokenNamenon_sealed");
//{ObjectTeams:
			javasymText = javasymText.replace("}",
					"\n" +
					"	// This alias is statically inserted by GenerateParserScript.java:\n" + 
					"	int TokenNameBINDOUT = TokenNameARROW;\n" + 
					"}");
// SH}
			Files.write(terminalTokensFile.toPath(), (terminalTokensProlog + "\tint " + javasymText).getBytes());
		}

		// Update ParserBasicInformation.java
		File javadefFile = new File(grammarDir, "javadef.java");
		File parserBasicInformationFile = new File(parserDir, "ParserBasicInformation.java");
		String javadefText = new String(Files.readAllBytes(javadefFile.toPath())).replace("\r\n", "\n");
		String parserBasicInformationText = new String(Files.readAllBytes(parserBasicInformationFile.toPath()));
		{
			String startTag = "// BEGIN_AUTOGENERATED_REGION";
			int start = parserBasicInformationText.indexOf(startTag);
			assertTrue(start >= 0);
			start += startTag.length();
			String parserBasicInformationProlog = parserBasicInformationText.substring(0, start);

			String javadefProlog =
					"interface javadef\n" + 
					"{\n" + 
					"    public final static int";
			assertTrue(javadefText.startsWith(javadefProlog));
			javadefText = javadefText.substring(javadefProlog.length());
			javadefText = javadefText.replace("\n      ", "\n\t\t\t\t\t");
			javadefText = javadefText.replaceAll(" +", " ");
			javadefText = javadefText.replace("};\n\n", "}\n");

			Files.write(parserBasicInformationFile.toPath(), (parserBasicInformationProlog + javadefText).getBytes());
		}

		// Update method consumeRule in Parser.java
		File parserFile = new File(parserDir, "Parser.java");
		String parserText = new String(Files.readAllBytes(parserFile.toPath()));
		File javaActionFile = new File(grammarDir, "JavaAction.java");
		String javaActionText = new String(Files.readAllBytes(javaActionFile.toPath()))
									.replace("\r\n",  "\n").replace(" \n", "\n").replace(" \n", "\n");
		{
			String startTag = "// BEGIN_AUTOGENERATED_REGION_CONSUME_RULE\n";
			String endTag = "// END_AUTOGENERATED_REGION_CONSUME_RULE\n";
			int start = parserText.indexOf(startTag);
			assertTrue(start >= 0);
			start += startTag.length();
			int end = parserText.indexOf(endTag, start);
			assertTrue(end >= 0);

			String newParserText = parserText.substring(0, start) + javaActionText + parserText.substring(end);

			Files.write(parserFile.toPath(), newParserText.getBytes());
		}

		// Clean up JikesPG output files
		Files.delete(javadclFile.toPath());
		Files.delete(javahdrFile.toPath());
		Files.delete(javaActionFile.toPath());
		Files.delete(javasymFile.toPath());
		Files.delete(javadefFile.toPath());
		Files.delete(new File(grammarDir, "javaprs.java").toPath());
		Files.delete(new File(grammarDir, "java.l").toPath());
	}

}
