import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import club.caliope.udc.DocumentConverter;
import club.caliope.udc.InputFormat;
import club.caliope.udc.OutputFormat;


/**
 * This class converts the old generated HTML files to ASCIIDOC file.
 * The paths are hardcoded and assume src and target to have the same base folder.
 * The html menu can be configured in template/document.html.erb
 * 
 * Requirements:
 * * Pandoc: https://pandoc.org/
 * 
 * To create HTML from the generated ASCIIDOC:
 * * mvn clean compile
 * * Copy "target/site"to "docs".
 * 
 * Link to view html locally in browser:
 *  file:///D:/projects/workspace-zoo/jdo.asciidoc/target/site/
 * 
 * @author Tilmann Zäschke
 */
public class ConvertHtml2Adoc {

	private static final String NL = "\n"; 
	// Base folder for src and output files
	//private static final Path basePath = Paths.get("C:\\work\\eclipse-workspace\\jdo.site");
	private static final Path basePath = Paths.get("D:\\projects\\workspace-zoo\\jdo.site");
	// Input folder
	private static final String input = "docs";
	// Output folder
	private static final String output = "adoc-out";

	public static void main(String[] args) throws IOException {
		Path srcPath = basePath.resolve(input);

		String executionPath = System.getProperty("user.dir");
		System.out.println(executionPath);

		Files.find(srcPath, 10, (p, a) -> { return true; }).forEach(p -> convert(p.toFile()));
	} 

	private static void convert(File src) {
		if (src.toString().contains("docs\\api")) {
			// skip 'api' folders
			return;
		}
		if (!src.toString().endsWith(".html")) {
			// skip non-html: css, ...
			return;
		}

		try {
			String srcName = src.getName();
			srcName = srcName.substring(0, srcName.lastIndexOf(".") + 1);
			String dstName = srcName + "adoc";

			Path srcPath = src.toPath();
			Path relPath = basePath.relativize(srcPath);

			int count = relPath.getNameCount();
			Path fullOutPath;
			if (count > 2) {
				//System.out.println("re2: " + relPath.subpath(1, count-1).toString());
				fullOutPath = Paths.get(basePath.toString(), output, relPath.subpath(1, count-1).toString(), dstName.toString());
			} else {
				fullOutPath = Paths.get(basePath.toString(), output, dstName.toString());
			}

			if (!fullOutPath.getParent().toFile().exists()) {
				Files.createDirectories(fullOutPath.getParent());
			}

			Files.deleteIfExists(fullOutPath);
			File outFile = Files.createFile(fullOutPath).toFile();
			new DocumentConverter()
			.fromFile(src, InputFormat.HTML)
			.toFile(outFile, OutputFormat.ASCIIDOC)
			//	     .addOption("-s")                     //optional
			//	     .workingDirectory(new File("/tmp"))  //optional
			.convert();
			postConvert(outFile);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	private static void postConvert(File dst) {
		BufferedReader br;
		BufferedWriter bw;
		String s;

		File tempDst = Paths.get(dst.toString() + ".tmp").toFile();
		dst.renameTo(tempDst);
		try {
			bw = new BufferedWriter(new FileWriter(dst, true));
			try {
				br = new BufferedReader(new FileReader(tempDst));

				// Write new header
				bw.write(header());

				// Skip old header
				while((s = br.readLine()) != null) {
					if (s.startsWith("[[contentBox]]")) {
						break;
					}
				}

				while((s = br.readLine()) != null) {
					//                	System.out.println("Checking: " + s);
					
					if (s.contains("[[footer]]")) {
						// skip footer and everything after it.
						break;
					}
					if (s.contains("'''''")) {
						// weird ''''' at ends of files
						break;
					}
					
					// Move headers up by one level
					if (s.startsWith("===")) {
						s = s.substring(1);
					} 
					
					// Handle select/option in 'release' files
//					if (s.contains("<select name=")) {
//						if (true) throw new IllegalStateException();
//						s = s.substring(0, s.indexOf("<select "));
//						bw.write(s + NL);
//						bw.write(NL);
//						s = br.readLine();
//						int pos;
//						while ((pos = s.indexOf("<option ")) >= 0) {
//							pos = s.indexOf(">", pos);
//							s = s.substring(pos + 1);
//							pos = s.indexOf("</option>");
//							String w = s.substring(0, pos);
//							bw.write("* " + w);
//						}
//					}
					if (s.startsWith("http://apache.mirror.anlx.net/")) {
						bw.write(selectForm() + NL);
						//skip next line
						br.readLine();
						continue;
					}
					

					//Lines 1 and 2:
					// TODO ? Replace Images:
					//link:./[image:images/JDOx150.gif[Apache JDO]]
					//link:./[image:images/jdo_text.gif[Apache JDO]]
					//image:images/JDOx150.gif[Apache JDO]
					//image:images/jdo_text.gif[Apache JDO]

					// Fix external links, except for actual javadoc html pages 
//					if (!s.contains("-javadoc/index.html")) {
//						s = s.replace(".html", ".adoc");
//					}
					// Fix internal crossrefs
					s = s.replace("link:#", "xref:");

					// Fix GIF not supported:
					s = s.replace(".gif", ".png");

					// Fix empty lines
					// see https://github.com/asciidoctor/asciidoctor/wiki/How-to-insert-sequential-blank-lines
					if (s.equals(" +")) {
						s = "{empty} +\n";
						bw.write(s + NL);
						continue;
					}

					// Fix crossref targets/anchors
					// INPUT:
					//[#PersistenceCapable]##
					//==== @PersistenceCapable[#aPersistenceCapable]####
					// OUPUT:
					//anchor:anchor-2[]
					while (s.contains("[#")) {
						int pos1 = s.indexOf("[#");
						int pos2 = s.indexOf("]", pos1+1);
						String post = "[" + s.substring(pos2);
						if (pos1 > 0) {
							s = s.substring(0, pos1) + "anchor:" + s.substring(pos1+2, pos2) + post;
						} else {
							s = "anchor:" + s.substring(2, pos2) + post;
						}
					}

					// some more hacks:
					s = s.endsWith("]##") ? s.substring(0, s.lastIndexOf(']') + 1) : s;
					s = s.endsWith("]####") ? s.substring(0, s.lastIndexOf(']') + 1) : s;
					// Fixes glossary.html
					int pos = s.indexOf("]####");
					if (pos >=0) {
						s = s.substring(0, pos + 1) + s.substring(pos + 5);
					}

					bw.write(s + NL);
				}
				br.close();
			} catch(FileNotFoundException e) {
				System.out.println("File was not found!");
			} catch(IOException e) {
				System.out.println("No file found!");
			}
			bw.close();
		} catch(FileNotFoundException e) {
			System.out.println("Error1!");
		} catch(IOException e) {
			System.out.println("Error2!");
		}
		tempDst.delete();
	}

	private static String header() {
		StringBuilder s = new StringBuilder();
		s.append("[[index]]").append(NL);
		
//		s.append("--").append(NL);
		s.append("image:images/JDOx100.png[float=\"left\"]").append(NL);
		s.append("image:images/jdo_text.png[float=\"right\"]").append(NL);
//		s.append("--").append(NL);
	
		// Hide title
		//s.append("= XYZ").append(NL);
		//s.append(":notitle:").append(NL);
		//s.append("== JDO TEST").append(NL);
		//s.append("link:./[image:images/JDOx150.gif[Apache JDO]]").append(NL);
		//s.append("link:./[image:images/jdo_text.gif[Apache JDO]]").append(NL);
		s.append(NL);
		s.append("'''''").append(NL);
		s.append(NL);
		s.append(":_basedir: ").append(NL);
		s.append(":_imagesdir: images/").append(NL);
		s.append(":notoc:").append(NL);
		s.append(":nofooter:").append(NL);
		s.append(":titlepage:").append(NL);
		s.append(":grid: cols").append(NL);
		s.append(NL);
		return s.toString();
	}
	
	private static String selectForm() {
		StringBuilder s = new StringBuilder();
		s.append(NL);
		s.append("* http://apache.mirror.anlx.net/ ").append(NL);
		s.append("* http://apache.mirrors.nublue.co.uk/ ").append(NL);
		s.append("* http://mirror.ox.ac.uk/sites/rsync.apache.org/ ").append(NL);
		s.append("* http://mirror.vorboss.net/apache/ ").append(NL);
		s.append("* http://mirrors.ukfast.co.uk/sites/ftp.apache.org/ ").append(NL);
		s.append("* http://www.mirrorservice.org/sites/ftp.apache.org/ ").append(NL);
		s.append("* ftp://ftp.mirrorservice.org/sites/ftp.apache.org/ ").append(NL);
		s.append("* https://www-eu.apache.org/dist/   (backup) ").append(NL);
		s.append("* https://www-us.apache.org/dist/   (backup) ").append(NL);
		return s.toString();
	}
}
