"""Shared methods for the Markov module."""
import logging

from markov.models import MarkovContext, MarkovState

logger = logging.getLogger(__name__)


def learn_line(line, context_name):
    """Create a bunch of MarkovStates for a given line of text."""
    logger.debug("learning %s...", line[:40])

    context, created = MarkovContext.objects.get_or_create(name=context_name)

    words = line.split()
    words = [MarkovState.start1, MarkovState.start2] + words + [MarkovState.stop]

    for word in words:
        if len(word) > MarkovState._meta.get_field('k1').max_length:
            return

    for i, word in enumerate(words):
        logger.debug("'{0:s}','{1:s}' -> '{2:s}'".format(words[i], words[i + 1], words[i + 2]))
        state, created = MarkovState.objects.get_or_create(context=context, k1=words[i], k2=words[i + 1],
                                                           v=words[i + 2])
        state.count += 1
        state.save()

        if i > len(words) - 4:
            break