package cz.vutbr.feec.utko.xonder02.lda;

import java.util.ArrayList;
import java.util.HashMap;

public class Dictionary {

    class Token {
        public int id;
        public String name;
        public int count;
    }

    private HashMap<String, Token> stringToToken = new HashMap<String, Token>();
    private ArrayList<Token> idToToken = new ArrayList<Token>();
    private HashMap<String, Token> notExistsTokens = new HashMap<String, Token>();

    public int putToken(String token) {
        Token t = stringToToken.get(token);

        if (t != null) {
            t.count++;
            return t.id;
        }

        t = new Token();
        t.name = token;
        t.count = 1;

        idToToken.add(t);
        t.id = idToToken.size() - 1;

        stringToToken.put(token, t);

        return t.id;
    }

    public void putNotExistsToken(String token) {
        Token t = stringToToken.get(token);

        if (t != null) {
            t.count++;

        } else {
            t = new Token();
            t.name = token;
            t.count = 1;

            notExistsTokens.put(token, t);
        }
    }

    public boolean tokenExists(String token) {
        return stringToToken.containsKey(token);
    }

    public int getTokenId(String token) {
        return stringToToken.get(token).id;
    }

    public String getTokenById(int tokenId) {
        return idToToken.get(tokenId).name;
    }

    public int getTokenCountById(int tokenId) {
        return idToToken.get(tokenId).count;
    }

    public int getNumberOfTokens() {
        return idToToken.size();
    }

    public int getNumberOfTokensOnlyInOneDocument() {
        int sum = 0;
        for (Token token : idToToken) {
            if (token.count == 1 && !notExistsTokens.containsKey(token.name)) {
                sum++;
            }
        }

        return sum;
    }
}
