"""
markov/models.py --- save brain pieces for chaining

"""

import logging

from django.db import models


log = logging.getLogger('markov.models')


class MarkovContext(models.Model):

    """Define contexts for Markov chains."""

    name = models.CharField(max_length=200, unique=True)

    def __str__(self):
        """String representation."""

        return "{0:s}".format(self.name)


class MarkovTarget(models.Model):

    """Define IRC targets that relate to a context, and can occasionally be talked to."""

    name = models.CharField(max_length=200, unique=True)
    context = models.ForeignKey(MarkovContext)

    chatter_chance = models.IntegerField(default=0)

    def __str__(self):
        """String representation."""

        return "{0:s} -> {1:s}".format(self.name, self.context.name)


class MarkovState(models.Model):

    """One element in a Markov chain, some text or something."""

    _start1 = '__start1'
    _start2 = '__start2'
    _stop = '__stop'

    k1 = models.CharField(max_length=128)
    k2 = models.CharField(max_length=128)
    v = models.CharField(max_length=128)

    count = models.IntegerField(default=0)
    context = models.ForeignKey(MarkovContext)

    class Meta:
        index_together = [
            ['context', 'k1', 'k2'],
            ['context', 'v'],
        ]
        permissions = {
            ('import_text_file', "Can import states from a text file"),
            ('teach_line', "Can teach lines"),
        }
        unique_together = ('context', 'k1', 'k2', 'v')

    def __str__(self):
        """String representation."""

        return "{0:s},{1:s} -> {2:s} (count: {3:d})".format(self.k1, self.k2, self.v, self.count)