package org.texttechnologylab.project.gruppe_05_1.domain.nlp;

import org.bson.Document;

import java.util.*;

public class Token {
    String text;
    String pos;
    String lemma;

    public Token() {
    }

    public Token(String text, String pos, String lemma) {
        this.text = text;
        this.pos = pos;
        this.lemma = lemma;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getPos() {
        return pos;
    }

    public void setPos(String pos) {
        this.pos = pos;
    }

    public String getLemma() {
        return lemma;
    }

    public void setLemma(String lemma) {
        this.lemma = lemma;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Token token)) return false;
        return Objects.equals(text, token.text) && Objects.equals(pos, token.pos) && Objects.equals(lemma, token.lemma);
    }

    @Override
    public int hashCode() {
        return Objects.hash(text, pos, lemma);
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", Token.class.getSimpleName() + "[", "]")
                .add("text='" + text + "'")
                .add("pos='" + pos + "'")
                .add("lemma='" + lemma + "'")
                .toString();
    }

    /**
     * Die Token-Dokumente (Speech --> analysisResults --> token) aus der MongoDB lesen
     * @param tokenDocs Eine Liste von Mongo-Dokumenten
     * @return Eine Liste der Token
     */
    public static List<Token> readTokensFromMongo(List<Document> tokenDocs) {
        List<Token> tokens = new ArrayList<>();
        for (Document doc : tokenDocs) {
            tokens.add(new Token(doc.getString("text"),
                                 doc.getString("pos"),
                                 doc.getString("lemma")
            ));
        }
        return tokens;
    }

    /**
     * Zählt alle verschiedenen POS Vorkommen auf
     * @param tokenList
     * @return Jede POS art mit ihrer Anzahl an Vorkommen
     */
    public static Map<String, Integer> countPOS(List<Token> tokenList) {
        Map<String, Integer> posCounts = new HashMap<>();

        for (Token token : tokenList) {
            posCounts.put(token.getPos(), posCounts.getOrDefault(token.getPos(), 0) + 1);
        }

        return posCounts;
    }
}
