package edu.neu.ccs.pyramid.feature_extraction;

import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
import edu.neu.ccs.pyramid.feature.Ngram;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import static org.junit.Assert.*;

public class NgramEnumeratorTest {
    public static void main(String[] args) {
//        test1();
//        test2();
//        test3();
    test4();
//    test7();
//    test8();
    }

    private static void test1(){
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        System.out.println(NgramEnumerator.toNgram(list,1,3));
    }

    private static void test2(){
        List<String> list = new ArrayList<>();
        Map<String,Integer> counts = new HashMap<>();
        list.add("a");
        list.add("b");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        NgramEnumerator.updateNgramCounts(list, 2, counts);
        System.out.println(counts);
    }

    private static void test3(){
        Map<Integer, String> tv = new HashMap<>();
        tv.put(0,"a");
        tv.put(1,"b");
//        tv.put(2,"c");
        tv.put(3,"d");
        tv.put(4,"e");
        tv.put(5,"f");
        tv.put(6,"g");
        tv.put(7,"a");
        tv.put(8,"b");
        System.out.println(NgramEnumerator.getNgramCounts(tv,2));
    }

    private static void test4(){
        System.out.println(new NgramTemplate("body",3, 2));

    }
//
//    private static void test5(){
//        List<List<Integer>> templates = NgramEnumerator.createTemplate(3, 1);
//        System.out.println("templates = "+ templates);
//        List<String> source = new ArrayList<>();
//        for (int i=0;i<10;i++){
//            source.add(""+i);
//        }
//        for (List<Integer> template: templates){
//            System.out.println("template = "+template);
//            Multiset<Ngram> multiset = ConcurrentHashMultiset.create();
//            NgramEnumerator.add(source,multiset,"body",1,template);
//            System.out.println(multiset);
//        }
//
//
//
//    }
//
//    private static void test6(){
//        List<List<Integer>> templates = NgramEnumerator.createTemplate(3, 2);
//        System.out.println("templates = "+ templates);
//        List<String> source = new ArrayList<>();
//        for (int i=0;i<10;i++){
//            source.add(""+i);
//        }
//        for (List<Integer> template: templates){
//            System.out.println("template = "+template);
//            Multiset<Ngram> multiset = ConcurrentHashMultiset.create();
//            NgramEnumerator.add(source,multiset,"body",1,template);
//            System.out.println(multiset);
//        }
//
//
//
//    }
//
//    private static void test7(){
//        List<List<Integer>> templates = NgramEnumerator.createTemplate(1, 0);
//        System.out.println("templates = "+ templates);
//        List<String> source = new ArrayList<>();
//        for (int i=0;i<10;i++){
//            source.add(""+i);
//        }
//        for (List<Integer> template: templates){
//            System.out.println("template = "+template);
//            Multiset<Ngram> multiset = ConcurrentHashMultiset.create();
//            NgramEnumerator.add(source,multiset,"body",1,template);
//            System.out.println(multiset);
//        }
//    }

    private static void test8(){
        NgramTemplate template = new NgramTemplate("body",3,1);
        Multiset<Ngram> multiset = ConcurrentHashMultiset.create();
        List<String> source = new ArrayList<>();
        for (int i=0;i<10;i++){
            source.add(""+i);
        }
        NgramEnumerator.add(source,multiset,template);
        System.out.println(multiset.elementSet().stream().map(Ngram::getNgram).collect(Collectors.toList()));
    }

}