package ee.esutoniagodesu.service;
import ee.esutoniagodesu.pojo.entity.EstJap;
import ee.esutoniagodesu.pojo.entity.JapEst;
import ee.esutoniagodesu.repository.project.JMDictDB;
import ee.esutoniagodesu.repository.project.PhraseEtDB;
import ee.esutoniagodesu.repository.project.PhraseJpDB;
import ee.esutoniagodesu.util.lang.lingv.JCCharacter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Sõnaraamatu lehe teenindamine
*/
@Service
@Transactional
public class DictService {
private static final Logger log = LoggerFactory.getLogger(DictService.class);
@Inject
private PhraseEtDB phraseEtDB;
@Inject
private PhraseJpDB phraseJpDB;
@Inject
private JMDictDB jmDictDB;
private static final int _limitAutocompleteSize = 100;
public Collection<String> autocomplete(String phrase) {
String lang = JCCharacter.isLatin(phrase.charAt(0)) ? "et" : "ja";
switch (lang) {
case "et": {
return phraseEtDB.getAutocomplete(phrase, _limitAutocompleteSize);
}
case "ja": {
return phraseJpDB.getAutocomplete(phrase, _limitAutocompleteSize);
}
default:
throw new IllegalArgumentException("Language not available: " + lang);
}
}
public List jmtrans(String locale, String phrase) {
String lang = JCCharacter.isLatin(phrase.charAt(0)) ? "et" : "ja";
switch (locale) {
case "ja": {
return estjap(lang, phrase);
}
default: {
return japest(lang, phrase);
}
}
}
/**
* Tõlkimine jaapani keele õppijale
* JP sisendi vastuseks on JP entry list & gloss. JP audio
* ET sisendi vastuseks on seda glossi sisaldavate entry'te list & nende glossid
*
* @return list JMDict entries that contain 0-or-* senses that contain 0-or-* glosses
* @see <a href="http://google.com">http://google.com</a>
*/
private List<JapEst> japest(String lang, String query) {
log.debug("japest: lang=" + lang + ", query=" + query);
List<JapEst> result = new ArrayList<>();
JapEst item;
switch (lang) {
case "et": {
for (int p : jmDictDB.findEntrIdsFromGloss(query)) {
item = jmDictDB.getEntryDataForJapEst(p);
if (item != null) result.add(item);
}
phraseEtDB.recordSearch(query, result.size(), "ja");
break;
}
case "ja": {
List<Integer> entrIds = jmDictDB.findEntrIdsByKanjOrKana(query);
for (int p : entrIds) {
item = jmDictDB.getEntryDataForJapEst(p);
if (item != null) result.add(item);
}
for (JapEst p : result) {
for (JapEst.Sens q : p.sens) {
//q.sentences = sentenceDB.getExampleSentences(p.kanj[0], p.rdng[0], p.sens.indexOf(q));
}
}
phraseJpDB.recordSearch(query, result.size(), "ja");
break;
}
default:
throw new IllegalArgumentException("Language not available: " + lang);
}
log.debug("japest: result.size=" + result.size());
return result;
}
/**
* Tõlkimine eesti keele õppijale
* JP sisendi vastuseks on eestikeelsed tõlked.
* ET audio, ET sõnaliigid, ET näitelaused
* <p/>
* <p/>
* Leia list entr, mis sisaldab "maja"
* <p/>
* <p/>
* Lisa igale kaardile estwn.example by variant.literal
*/
private List<EstJap> estjap(String lang, String query) {
List<EstJap> result = new ArrayList<>();
switch (lang) {
case "et": {//otsingusõna on eesti keeles
List<Integer> entrids = jmDictDB.findEntrIdsFromGloss(query);
EstJap estjap = estjap(query, entrids);
if (estjap != null) result.add(estjap);
phraseEtDB.recordSearch(query, result.size(), "et");
break;
}
case "ja": {//otsingusõna jaapani keeles
List<Integer> entrids = jmDictDB.findEntrIdsByKanjOrKana(query);
for (int i : entrids) {
for (String gloss : jmDictDB.getGlossByEntr(i)) {
List<Integer> iwrap = jmDictDB.findEntrIdsFromGloss(gloss);
result.add(estjap(gloss, iwrap));
}
}
phraseJpDB.recordSearch(query, result.size(), "et");
break;
}
default:
throw new IllegalArgumentException("not available: " + lang);
}
log.debug("estjap: result.size=" + result.size());
return result;
}
private EstJap estjap(String query, List<Integer> entrids) {
EstJap item = null;
if (entrids.size() > 0) {
item = new EstJap();
item.gtxt = query;
String[] sonaliigid = phraseEtDB.getSonaliigid(query);
if (sonaliigid != null && sonaliigid.length > 0)
item.gpos = toHumanReadableSonaliigid(sonaliigid);
for (int p : entrids) {
JapEst japest = jmDictDB.getEntryDataForJapEst(p);
EstJap.Sens sens = new EstJap.Sens(japest.kanj, japest.rdng);
sens.entr = p;
item.sens.add(sens);
}
//item.sentences = sentenceDB.getEestiWordnetExampleSentences(query);
}
return item;
}
private static String[] toHumanReadableSonaliigid(String[] sonaliigid) {
for (int i = 0; i < sonaliigid.length; i++) {
switch (sonaliigid[i]) {
case "n": {
sonaliigid[i] = "n";
break;
}
case "v": {
sonaliigid[i] = "v";
break;
}
case "a": {
sonaliigid[i] = "adj";
break;
}
case "b": {
sonaliigid[i] = "adv";
break;
}
}
}
return sonaliigid;
}
}