import logging

from normalutils.choices import StateType
import omodels as om
import models as sm


word_fn = lambda word: {
    "spelling": word.spelling,
    "importance": word.importance,
    "state": StateType.PUBLISHED.value,
}
meaning_fn = lambda meaning: {
    "meaning": meaning.meaning,
    "word_property": meaning.word_property,
    "state": StateType.PUBLISHED.value
}


def migrate_word_meanings(o_session, word: sm.Word):
    if word.spelling is None:
        logging.error("word is None. word id is {}".format(word.id))
        return
    meanings = word.meanings
    o_word_dict = word_fn(word)
    o_word = om.OWord(**o_word_dict)
    o_session.add(o_word)

    for meaning in meanings:
        meaningfield = om.OMeaningField(word=o_word)
        o_session.add(meaningfield)
        meaning_dict = meaning_fn(meaning)
        meaning = om.OMeaning(meaningfield=meaningfield, **meaning_dict)
        o_session.add(meaning)


if __name__ == "__main__":
    with sm.Session() as s_session:
        words = s_session.query(sm.Word)
        with om.OSession() as o_session:
            for word in words:
                migrate_word_meanings(o_session, word)
            o_session.commit()