/*
 ***********************************************************************
 * Copyright (C) 2005, International Business Machines Corporation and *
 * others. All Rights Reserved.                                        *
 ***********************************************************************
 *
 */

package com.ibm.icu.dev.tool.charsetdet.sbcs;

import java.util.Collection;
import java.util.TreeMap;

import com.ibm.icu.text.UnicodeSet;

/**
 * @author emader
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class NGramList
{
    public interface NGramKeyMapper
    {
        Object mapKey(String key);
    }
    
    public static final class NGram implements Comparable
    {
        private String value;
        private int refCount;
        
        public NGram(String theValue, int theRefCount)
        {
            value    = theValue;
            refCount = theRefCount;
        }
        
        public NGram(String theValue)
        {
            this(theValue, 1);
        }
        
        public NGram(NGram other)
        {
            this(other.getValue(), other.getRefCount());
        }
        
        public final String getValue()
        {
            return value;
        }
        
        public final int getRefCount()
        {
            return refCount;
        }
        
        public final void incrementRefCount()
        {
            refCount += 1;
        }
        
        // Note: This makes higher refCounts come *before* lower refCounts...
        public int compareTo(Object o)
        {
            NGram ng = (NGram) o;
            
            return ng.getRefCount() - refCount;
        }
    }
    
    protected TreeMap ngrams;
    protected int totalNGrams;
    protected int uniqueNGrams;

    protected final int N_GRAM_SIZE = 3;
    
    private NGramKeyMapper keyMapper;

    /**
     * 
     */
    public NGramList(NGramKeyMapper theMapper)
    {
        keyMapper = theMapper;
        
        ngrams = new TreeMap();
        totalNGrams = uniqueNGrams = 0;
    }
    
    public void setMapper(NGramKeyMapper nGramKeyMapper)
    {
        keyMapper = nGramKeyMapper;
    }
    
    public NGram get(Object mappedKey)
    {
        return (NGram) ngrams.get(mappedKey);
    }
    
    public NGram get(String key)
    {
        Object mappedKey = keyMapper.mapKey(key);
        
        return get(mappedKey);
    }
    
    public void put(String key)
    {
        Object mappedKey = keyMapper.mapKey(key);
        NGram ngram = get(mappedKey);
        
        totalNGrams += 1;
        
        if (ngram == null) {
            uniqueNGrams += 1;
            ngrams.put(mappedKey, new NGram(key));
        } else {
            ngram.incrementRefCount();
        }
    }
    
    public Collection values()
    {
        return ngrams.values();
    }
    
    public Collection keys()
    {
        return ngrams.keySet();
    }
    
    public int getTotalNGrams()
    {
        return totalNGrams;
    }
    
    public int getUniqueNGrams()
    {
        return uniqueNGrams;
    }
}
