// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 2010-2013, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.docs;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.BitSet;
import java.util.Date;
import java.util.TreeSet;


/**
 * @author yumaoka
 *
 */
public class CollectAPI {
    private static final int MAXSTATE = APIInfo.STA_INTERNAL;

    private APIData _apidata;


    CollectAPI(String file) {
        _apidata = APIData.read(file, true);
    }

    void writeHTML(String outfile, BitSet filter) throws IOException {

        // collecting versions
        TreeSet<String> versions = new TreeSet<String>();
        for (APIInfo info : _apidata.set) {
            versions.add(info.getStatusVersion());
        }

        FileOutputStream fos = new FileOutputStream(outfile);
        PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")));

        String title = "ICU4J API Collection: " + _apidata.name;
        String note = "Contents generated by CollectAPI tool on " + new Date().toString();

        pw.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        pw.println("<html>");
        pw.println("<head>");
        pw.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">");
        pw.println("<title>" + title + "</title>");
        pw.println("</head>");
        pw.println("<body>");

        pw.println("<h1>" + title + "</h1>");

        for (String ver : versions) {
            boolean sawEntryForVersion = false;

            for (int state = 0; state <= MAXSTATE; state++) {
                if (!filter.get(state)) {
                    continue;
                }

                boolean firstInState = true;
                String pack = "";
                String clas = "***";  // hack - we just need a class name never used 
                boolean inList = false;

                for (APIInfo info : _apidata.set) {
                    if (!info.getStatusVersion().equals(ver)) {
                        continue;
                    }
                    if (state != info.getVal(APIInfo.STA)) {
                        continue;
                    }

                    if (!sawEntryForVersion) {
                        pw.println("<h2>Status Version: " + ver + "</h2>");
                        sawEntryForVersion = true;
                    }

                    if (firstInState) {
                        pw.println("<h3>[" + getStatusTypeName(state) + "]</h3>");
                        firstInState = false;
                    }

                    String packageName = info.getPackageName();
                    if (!packageName.equals(pack)) {
                        if (inList) {
                            pw.println("</ul>");
                            inList = false;
                        }
                        pw.println("<h4>Package: " + packageName + "</h4>");
                        pack = packageName;
                    }

                    String className = info.getClassName();
                    if (className.length() == 0) {
                        // next class
                        if (inList) {
                            pw.println("</ul>");
                            inList = false;
                        }
                        pw.print("<p><span style='color:red'>Class: </span>");
                        info.print(pw, false, true, false);
                        pw.println("</p>");
                        clas = className;
                        continue;
                    }
                    if (!className.equals(clas)) {
                        if (inList) {
                            pw.println("</ul>");
                            inList = false;
                        }
                        pw.println("<span style='color:green'>APIs: </span>" + className);
                        clas = className;
                    }

                    if (!inList) {
                        pw.println("<ul>");
                        inList = true;
                    }
                    pw.print("<li>");
                    info.print(pw, false, true, false);
                    pw.println("</li>");
                }

                if (inList) {
                    pw.println("</ul>");
                }
            }

            if (sawEntryForVersion) {
                pw.println();
                pw.println("<hr/>");
            }
        }

        pw.println("<p><i><font size=\"-1\">" + note + "</font></i></p>");

        pw.println("</body>");
        pw.println("</html>");
        pw.close();
    }

    void writeTSV(String outfile, BitSet filter) throws IOException {
        FileOutputStream fos = new FileOutputStream(outfile);
        PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")));

        for (APIInfo info : _apidata.set) {
            if (!filter.get(info.getVal(APIInfo.STA))) {
                continue;
            }
            StringBuilder buf = new StringBuilder();

            // package
            buf.append(info.getPackageName());
            buf.append("\t");

            // class
            String className = info.getClassName();
            if (className.length() == 0) {
                className = info.getName();
            }
            buf.append(className);
            buf.append("\t");

            // signature, etc
            info.format(buf, false, false, false);
            buf.append("\t");

            // status
            buf.append(APIInfo.getTypeValName(APIInfo.STA, info.getVal(APIInfo.STA)));
            buf.append("\t");

            // version
            String statusVer = info.getStatusVersion();
            if (statusVer.length() == 0) {
                statusVer = "[N/A]";
            }
            buf.append(statusVer);

            pw.println(buf.toString());
        }
        pw.close();
    }

    public static void main(String[] args) {
        String apifile = null; 
        String outfile = null;
        BitSet filter = new BitSet(MAXSTATE + 1);
        boolean isTSV = false;

        // default filter
        filter.set(APIInfo.STA_STABLE);
        filter.set(APIInfo.STA_DRAFT);
        filter.set(APIInfo.STA_DEPRECATED);

        for (int i = 0; i < args.length; i++) {
            if (args[i].equals("-f")) {
                if (i + 1 == args.length) {
                    System.out.println("Missing filter argument");
                    return;
                }
                i++;
                String[] types = args[i].split(",");
                filter.clear();
                for (String type : types) {
                    if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_STABLE))) {
                        filter.set(APIInfo.STA_STABLE);
                    } else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_DRAFT))) {
                        filter.set(APIInfo.STA_DRAFT);
                    } else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_DEPRECATED))) {
                        filter.set(APIInfo.STA_DEPRECATED);
                    } else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_OBSOLETE))) {
                        filter.set(APIInfo.STA_OBSOLETE);
                    } else if (type.equalsIgnoreCase(getStatusTypeName(APIInfo.STA_INTERNAL))) {
                        filter.set(APIInfo.STA_INTERNAL);
                    } else {
                        System.out.println("Bad filter type " + type);
                        return;
                    }
                }
            } else if (args[i].equals("-o")) {
                if (i + 1 == args.length) {
                    System.out.println("Missing filter argument");
                    return;
                }
                i++;
                outfile = args[i];
            } else if (args[i].equals("-t")) {
                isTSV = true;
            } else {
                apifile = args[i];
                if (i + 1 != args.length) {
                    System.out.println("Too many arguments");
                    return;
                }
            }
        }

        if (apifile == null) {
            System.out.println("No API file specified");
            return;
        }

        CollectAPI collection = new CollectAPI(apifile);

        try {
            if (isTSV) {
                if (outfile == null) {
                    outfile = "api.tsv";
                }
                collection.writeTSV(outfile, filter);
            } else {
                if (outfile == null) {
                    outfile = "api.html";
                }
                collection.writeHTML(outfile, filter);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String getStatusTypeName(int status) {
        String name = null;
        switch (status) {
        case APIInfo.STA_STABLE:
            name = "Stable";
            break;

        case APIInfo.STA_DRAFT:
            name = "Draft";
            break;

        case APIInfo.STA_DEPRECATED:
            name = "Deprecated";
            break;

        case APIInfo.STA_OBSOLETE:
            name = "Obsolete";
            break;

        case APIInfo.STA_INTERNAL:
            name = "Internal";
            break;

        default:
            throw new IllegalArgumentException("Bad API status type " + status);
        }

        return name;
    }
}
