/*******************************************************************************
 * Copyright (c) 2012, 2016 Original authors and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Original authors and others - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.examples;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.eclipse.nebula.widgets.nattable.examples.runner.TabbedNatExampleRunner;

public class NatTableExamples {

    public static void main(String[] args)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException {
        if (args.length == 0) {
            List<String> examples;

            InputStream inputStream = NatTableExamples.class.getResourceAsStream("/examples.index");
            if (inputStream != null) {
                examples = new ArrayList<String>();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String line = reader.readLine();
                while (line != null) {
                    examples.add(line);
                    line = reader.readLine();
                }
                reader.close();
            } else {
                System.out.println("examples.index not found, reconstructing");
                examples = createExamplesIndex(null);
            }

            TabbedNatExampleRunner.run(examples.toArray(new String[0]));
        } else if (args.length == 2 && "--createIndex".equals(args[0])) {
            System.out.println("Creating examples.index");
            System.out.println("basedir: " + args[1]);
            createExamplesIndex(args[1]);
        } else {
            System.out.println("Usage: NatTableExamples [--createIndex <basedir>]");
        }
    }

    public static List<String> createExamplesIndex(String basedir)
            throws IOException {
        List<String> examples = new ArrayList<String>();

        File examplesDir = new File(basedir, "src" + INatExample.BASE_PATH);
        findTutorialExamples(examplesDir, examples);

        examplesDir = new File(basedir, "src" + INatExample.CLASSIC_BASE_PATH);
        findExamples(examplesDir, examples, INatExample.CLASSIC_EXAMPLES_PREFIX);

        File examplesIndexFile = new File(new File(basedir, "src"), "examples.index");
        BufferedWriter writer = new BufferedWriter(new FileWriter(examplesIndexFile));
        for (String example : examples) {
            writer.write(example + "\n");
        }
        writer.flush();
        writer.close();

        return examples;
    }

    private static void findTutorialExamples(File dir, List<String> examples)
            throws IOException {
        FilenameFilter packageFilter = new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                return name.matches("_\\d{3}.*");
            }
        };

        List<String> sortedList = Arrays.asList(dir.list(packageFilter));
        Collections.sort(sortedList);
        for (String packageName : sortedList) {
            File f = new File(dir, packageName);
            if (f.isDirectory()) {
                findExamples(f, examples, INatExample.TUTORIAL_EXAMPLES_PREFIX);
            }
        }
    }

    public static void findExamples(File dir, List<String> examples, String prefix)
            throws IOException {
        List<String> sortedList = Arrays.asList(dir.list());
        Collections.sort(sortedList);
        for (String s : sortedList) {
            File f = new File(dir, s);
            if (f.isDirectory()) {
                findExamples(f, examples, prefix);
            } else {
                String examplePath = dir.getCanonicalPath() + File.separator + s;
                examplePath = examplePath.replace(File.separator, "/"); // Convert
                                                                        // to
                                                                        // /-delimited
                                                                        // path
                if (examplePath.endsWith(".java")) {
                    examplePath = examplePath.replaceAll("^.*/src/", "").replaceAll("\\.java$", "");
                    examples.add(prefix + examplePath);
                }
            }
        }
    }

}
