package org.unicode.cldr.unittest;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Map.Entry;
import java.util.Set;

import org.unicode.cldr.util.CLDRConfig;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.util.ICUUncheckedIOException;

public class TestLdml2IcuCompleteness extends TestFmwk{
    
    private static final String CLDR_BASE = CLDRConfig.getInstance().getCldrBaseDirectory() + "/common";
    private static final String ICU_BASE = CLDRConfig.getInstance().getCldrBaseDirectory() + "/../icu4c/data/"; // "/Users/markdavis/workspace/icu4c/data";

    static Multimap<String,File> icuFiles = TreeMultimap.create();
    static Multimap<String,File> cldrFiles = TreeMultimap.create();
    
    static Set<String> SKIP_DIRS = ImmutableSet.of(
        "transforms", "translit", // temp
        "unidata", 
        "sprep", 
        "mappings");
    static Set<String> SKIP_FILES = ImmutableSet.of(
        "attributeValueValidity", 
        "tzdbNames");

    static {
        fillMap(new File(ICU_BASE), ".txt", icuFiles);
//        for (Entry<String, Collection<File>> s : icuFiles.asMap().entrySet()) {
//            System.out.println(s.getKey() + "\t\t" + s.getValue());
//        }

        fillMap(new File(CLDR_BASE), ".xml", cldrFiles);
        for (Entry<String, Collection<File>> s : cldrFiles.asMap().entrySet()) {
            System.out.println(s.getKey() + "\t\t" + s.getValue());
        }
    }

    
    static void fillMap(File file, String suffix, Multimap<String, File> fileList) {
        try {
            for (File f : file.listFiles()) {
                String name = f.getName();
                if (f.isDirectory()) {
                    if (SKIP_DIRS.contains(name)) {
                        continue;
                    }
                    fillMap(f, suffix, fileList);
                } else {
                    if (!name.endsWith(suffix)) {
                        continue;
                    }
                    // hack
                    if (name.endsWith("dict.txt") || name.contains("readme")) {
                        continue;
                    }
                    name = name.substring(0, name.length()-suffix.length());
                    if (SKIP_FILES.contains(name)) {
                        continue;
                    }
                    fileList.put(name, f.getParentFile().getCanonicalFile());
                }
            }
        } catch (IOException e) {
            throw new ICUUncheckedIOException(e);
        }
    }

    public static void main(String[] args) {
        new TestLdml2IcuCompleteness().run(args);
    }
    
    public void TestFiles() {
        verifySuperset("cldrFiles-icuFiles", cldrFiles.keySet(), icuFiles.keySet());
        verifySuperset("icuFiles-cldrFiles", icuFiles.keySet(), cldrFiles.keySet());
    }

    private void verifySuperset(String title, Set<String> set1, Set<String> set2) {
        LinkedHashSet<String> diff = new LinkedHashSet<>(set1);
        diff.removeAll(set2);
        assertEquals(title, Collections.EMPTY_SET, diff);
    }
    
    public void TestLocales() {
        for (Entry<String, Collection<File>> entry : cldrFiles.asMap().entrySet()) {
            String file = entry.getKey();
            Set<String> values = collectCldrValues(file, entry.getValue());
        }
    }

    // TODO flesh out
    private Set<String> collectCldrValues(String file, Collection<File> value) {
        for (File f : value) {
            //org.unicode.cldr.util.XMLFileReader.loadPathValues(filename, data, validating)
        }
        return null;
    }
}

