#coding: utf-8
from django.db import models
from django.contrib.auth.models import User

"""
  by: Jacinto José Franco
  Este aquivo contem todas as entidades necessarias para fazer com que os experimentos randomizados funcionem
"""

class StrategyRandomization(models.Model):
    """
    Esta entidade armazena as definições das estratégias de randomização dos experimentos,
    o que possibilita mudar do algoritmo (Operador do PlanOut) e também definir um Design
    do experimento personalizado.
    """
    # Strategy: Uniform, WeightedChoice, BernoulliTrial, RandomInteger, Block Randomization
    strategyType = models.CharField(max_length=50)

    # Lista de percents do WeightedChoice
    percents = models.CharField(max_length=50, null=True)

    # PlanoutScript
    planoutScript = models.TextField(blank=True, null=True)
    planoutJson = models.TextField(blank=True, null=True)

    # Customizada --campo gerado por softwares como o JMP, SAS e R, o que possibilita criar todo tipo de randomização
    customDesign = models.TextField(blank=True, null=True)

class ExperimentDefinition(models.Model):
    """
    Esta entidade permite armazenar as definições dos experimentos, onde uma linha correspondente a um experimento de uma semana do edX.
    """

    descricao = models.CharField(max_length=60, default='meuprimeiroexperimento') # descricao do ExperimentoDeverei gerar um número ou data para a descrição
    course = models.CharField(max_length=60)
    userTeacher = models.ForeignKey(User)

    #algoritmo = models.CharField por enquanto só será utilizado A/B, depois pensarei nos demais
    strategy = models.ForeignKey(StrategyRandomization)


class OpcoesExperiment(models.Model):
    """
    Nesta entidade grava-se as opções do experimento. Em um teste A/B são inseridas duas versões do experimento.
    SectionExp serve para identificar uma uma opção/arm no Studio, já sectionExp_url serve para identificar uma entidade no LMS.
    """
    experimento = models.ForeignKey(ExperimentDefinition)
    sectionExp = models.CharField(max_length=100)
    sectionExp_url = models.CharField(max_length=50)
    version = models.CharField(max_length=1) # A ou B # Se Não tiver A, então Esta inserido a versão versão A


class UserChoiceExperiment(models.Model):
    """
    Esta entidade serve para armazenar as versões/arms definidas pela randomização definida em StrategyRandomization e atribuída
    para cada aluno, o que permite recuperar uma versão previamente definida e manter esta versão até o término do curso.
    """
    userStudent = models.ForeignKey(User)
    versionExp = models.ForeignKey(OpcoesExperiment)
    bloco = models.IntegerField(blank=True) # VOU REMOVER
    experimento = models.ForeignKey(ExperimentDefinition)


class HistoricoQuestoes(models.Model):
    """
    Terei que retirar esta tabela, pois o edX já implementa a função do histórico. NÃO PRECISA TRADUZIR
    """
    campo = models.CharField(max_length=600)
    valor = models.CharField(max_length=600)
    usuario = models.ForeignKey(User)


class AnonyMousPost(models.Model):
    """
    Com esta tabela armazena-se os o id e o usuario dos comentários anônimos. Desta forma fica mais fácil para recuperar, pois na lista
    de retornada para o LMS não há nenhuma identificação acerta dos posts post anônimos.
    """
    user = models.IntegerField()
    commentid = models.CharField(max_length=50)
@@ -112,16 +112,101 @@
  Franco%0A
+  This file contains all necessary classes to make the randomized experiments run%0A  %0A
   Este a
@@ -355,32 +355,248 @@
 Model):%0A    %22%22%22%0A
+    This class stores all strategy definitions for randomizing the experiments. This will%0A    allow the change in algorithm (Planot Operator) as well as the definition of the Design of a%0A    personalized experiment%0A%0A
     Esta entidad
@@ -1406,32 +1406,165 @@
 Model):%0A    %22%22%22%0A
+    This class allows for the storage of all experiment definitions, where a row corresponds to the experiment in a week within edX%0A%0A
     Esta entidad
@@ -2135,24 +2135,241 @@
 l):%0A    %22%22%22%0A
+    This class record the experiment options. In an AB test we have two arms or two versions of the intervention. %0A    SectionExp identified an arm in Studio, whereas sectionExp_url identifies an entitity in the LMS%0A%0A
     Nesta en
@@ -2925,24 +2925,273 @@
 l):%0A    %22%22%22%0A
+    This class stores all arms defined by the randomization defined under the StrategyRandomization, which is %0A    attributed to each learner. This allows for a previously defined version while keeping this version until%0A    the end of the course.%0A%0A
     Esta ent
@@ -3978,24 +3978,211 @@
 l):%0A    %22%22%22%0A
+    This table stores the id and user from anonymous comments. This makes it easier to recover them, since this query%0A    will not return any data on the anonymous posts back to the LMS%0A%0A
     Com esta

add English translation to docstrings