from __future__ import unicode_literals
from audit_log.models.managers import AuditLog

from django.db import models

from participant.models import Participant

from survey.constants import DATA_TYPE, STRING, CHOICES, DISPLAY_TYPE

class Survey(models.Model):
    """
    Survey is stored here and linked to study
    """
    title = models.CharField(max_length=64)
    sibling = models.ForeignKey('self', null=True)
    audit_log = AuditLog()

    def __unicode__(self):
        return self.title

class Entity(models.Model):
    """
    """
    name = models.CharField(max_length=64)
    data_type = models.CharField(max_length=12, choices=DATA_TYPE, default=STRING)
    parent = models.ForeignKey("self", null=True, blank=True)
    child_of = models.ForeignKey("Entity", related_name="children_of", null=True, blank=True)
    is_coded = models.BooleanField(default=False)


    def __str__(self):
        return '%s' % self.name

class Question(Entity):
    """
    """
    title = models.CharField(max_length=255, null=True, blank=True)

    def __unicode__(self):
        return "{0} ({1})".format(self.title, self.name)


class QuestionSurvey(models.Model):
    """
    """
    survey = models.ForeignKey(Survey)
    question = models.ForeignKey(Question)
    order = models.IntegerField(null=True)
    allows_multiple = models.BooleanField(default=False)
    is_required = models.BooleanField(default=True)
    audit_log = AuditLog()


    def __unicode__(self):
        return "Question : {1}".format(self.pk)

    class Meta:
        ordering = ("order",)

class AllowedResponse(models.Model):
    """option to the question are rendered here"""
    question = models.ForeignKey(Question)
    value = models.CharField(max_length=255)
    order = models.PositiveSmallIntegerField()
    icon_name = models.CharField(max_length=64, null=True, blank=True)
    display_name = models.CharField(max_length=255, null=True, blank=True)
    is_expected_value = models.BooleanField(default=False)
    participant = models.ForeignKey(Participant, null=True, blank=True)
    audit_log = AuditLog()

    def __unicode__(self):
        return "{0} ({1})".format(self.display_name, self.value)


class Observation(models.Model):
    """
    user inputs/responses/answers for questions are stored here
    """
    question_survey = models.ForeignKey(QuestionSurvey)
    participant = models.ForeignKey(Participant)
    entry_date = models.DateTimeField(null=True, blank=True)
    parent = models.ForeignKey("Observation", null=True, blank=True)
    str_value = models.TextField(null=True, blank=True)
    int_value = models.CharField(max_length=64, null=True, blank=True)
    double_value = models.CharField(max_length=64, null=True, blank=True)
    date_value = models.CharField(max_length=64, null=True, blank=True)
    text_value = models.TextField(null=True, blank=True)
    file_value = models.TextField(null=True, blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    modified_on = models.DateTimeField(auto_now=True)
    is_edited = models.BooleanField(default=False)
    # local_date = models.CharField(null=True, blank=True, max_length=64)
    local_timezone = models.CharField(max_length=50, null=True, blank=True)


    def __unicode__(self):
        return self.question_survey.question.title