import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class sigPlace {

    final static String ROOTDIR = "sitefiles";
    final static String REFDIR = "ref";
    final static String OUTDIR = "out";
    static int PORT = 8080;

    final static HashMap<String,String> map = new HashMap<>(Map.ofEntries(
        new AbstractMap.SimpleEntry<>("$SITENAME", "SigPlace"),
        new AbstractMap.SimpleEntry<>("$SITE_BACKCOL", "#111"),
        new AbstractMap.SimpleEntry<>("$TITLE_CONTENT_START", "<div class=\"contentWrapper\"><h1>"),
        new AbstractMap.SimpleEntry<>("$TITLE_CONTENT_END", "</h1><div class=\"content\">"),
        new AbstractMap.SimpleEntry<>("$CONTENT_END", "</div>"),
        new AbstractMap.SimpleEntry<>("$DATE_CONTENT_START", "<div class=\"date\">")
    ));
    final static HashMap<String,Path> ops = new HashMap<>(Map.ofEntries(
        new AbstractMap.SimpleEntry<>(
            "%DEFAULT", Paths.get(REFDIR,"DEFAULT.html")),
        new AbstractMap.SimpleEntry<>(
            "%FOOTER", Paths.get(REFDIR,"FOOTER.html"))
    ));
    public static void main(String[] args) {

        if (args.length>0&&args.length%2==0) {
            int i=0;
            while (i<args.length) {
                String arg1=args[i];
                String arg2=args[i+1];
                i+=2;
                if (arg1.equals("-p")) {
                    PORT=Integer.parseInt(arg2);
                    System.out.println("Port set to "+PORT+".");
                } else {
                    System.err.println("Invalid argument \""+arg1+"\".");
                    return;
                }
            }
        }

        Set<Path> files = GetFilesInDir(ROOTDIR);
        for (Path f : files) {

            System.out.println(" Found "+f.getFileName());

            try {

                System.out.println("  Preparing "+f.getFileName());

                List<String> content = Files.readAllLines(f);
                if (isHTMLFile(f)) {
                    content.addAll(0,Files.readAllLines(ops.get("%DEFAULT")));
                    content.addAll(Files.readAllLines(ops.get("%FOOTER")));
                }

                System.out.println("  Parsing "+f.getFileName());
                for (int i=0;i<content.size();i++) {
                    String s = content.get(i);
                    if (s.length()>0&&isHTMLFile(f)) {
                        //Check for markdown pieces.
                        if (s.charAt(0)=='-') {
                            //Start of a title piece.
                            s=s.replace("-",map.get("$TITLE_CONTENT_START"));
                            s=s+map.get("$TITLE_CONTENT_END");
                        } else
                        if (s.contains("===")) {
                            s=map.get("$CONTENT_END")+map.get("$DATE_CONTENT_START")+s.replace("===","")+map.get("$CONTENT_END")+map.get("$CONTENT_END");
                        }
                    }
                    for (String key : map.keySet()) {
                        s=s.replaceAll(Pattern.quote(key),map.get(key));
                    }
                    content.set(i,s);
                }

                Path newf = Paths.get(OUTDIR,f.getFileName().toString());

                System.out.println("  Writing to "+newf);

                Files.write(newf, content, Charset.defaultCharset(),StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.WRITE);
                
                System.out.println(" "+newf.getFileName() + " conversion complete!");

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Site has been built into the "+OUTDIR+" directory.");

        ExportCodeFile();

        System.out.println("\nStarting web server...");
        new sigServer();
    }
    private static boolean isHTMLFile(Path f) {
        return f.getFileName().toString().contains(".html");
    }
    private static void ExportCodeFile() {
        try {
            Path file = Paths.get("sigServer.java");
            List<String> data = Files.readAllLines(file);
            int i=0;
            while (!data.get(i++).contains("sigServer()")&&i<data.size());
            if (i<data.size()) {
                Files.write(Paths.get(OUTDIR,"codeBackground"),data.subList(i, Math.min(i+40,data.size())),Charset.defaultCharset(),StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.WRITE);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    private static Set<Path> GetFilesInDir(String directory) {
        Path dir = Paths.get(directory);
        try {
            return Files.list(dir).collect(Collectors.toSet());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}