from rest_framework import serializers
from participant.models import Participant, ParticipantStudyConsent
from survey.api import QuestionSurveyApi
from survey.constants import DISPLAY_TYPE
from survey.models import Observation

__author__ = 'aamirbhatt'


class SurveyObservationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Observation
        fields = (
            "question_survey", "entry_date", "str_value", "int_value", "double_value", "text_value", "file_value",
            "date_value", "local_timezone")

    def validate(self, attrs):
        question_survey = attrs["question_survey"]
        str_value = attrs.get("str_value")
        int_value = attrs.get("int_value")
        double_value = attrs.get("double_value")
        text_value = attrs.get("text_value")
        file_value = attrs.get("file_value")
        date_value = attrs.get("date_value")
        return attrs

    def _validate_type(self, id, attrs):
        """ data_type is checked against the entity type """
        type = QuestionSurveyApi()._data_type(id)
        if type == "str" and not attrs.get("str_value"):
            raise serializers.ValidationError("str_value is required")
        if type == "int" and not attrs.get("int_value"):
            raise serializers.ValidationError("int_value is required")
        if type == "double" and not attrs.get("double_value"):
            raise serializers.ValidationError("double_value is required")
        if type == "text" and not attrs.get("text_value"):
            raise serializers.ValidationError("text_value is required")
        if type == "file" and not attrs.get("file_value"):
            raise serializers.ValidationError("file_value is required")
        if type == "date" and not attrs.get("date_value"):
            raise serializers.ValidationError("date_value is required")


class ObservationSerializer(serializers.ModelSerializer):
    # participant = serializers.SerializerMethodField()
    # survey = serializers.SerializerMethodField()

    class Meta:
        model = Observation
        fields = (
            "id","entry_date", "str_value", "int_value", "double_value", "text_value", "file_value", "date_value",
             "question_survey", "created_on", "modified_on", "parent", "local_timezone")

    def get_participant(self, obj):
        if obj:
            return obj.participant.id


class CreateQuestionSerialize(serializers.Serializer):
    title = serializers.CharField(max_length=32,required=True)
    display_type = serializers.ChoiceField(choices=DISPLAY_TYPE,required=True)

class OptionQuestionSerialize(serializers.Serializer):
    display_name =  serializers.CharField(max_length=32,required=True)
    value =  serializers.CharField(max_length=32,required=True)
    is_expected =  serializers.BooleanField(required=False)

class AllowedResponseSerializer(serializers.ListSerializer):
    child = OptionQuestionSerialize(required=True)

class SurveyQuestionSerializer(serializers.Serializer):
    order = serializers.IntegerField(required=False)
    is_required = serializers.BooleanField(required=False,default=False)
