from participant.api import ParticipantApi, ParticipantStudyConsentApi
from participant.models import Participant, ParticipantStudyConsent

__author__ = 'aamirbhatt'

from rest_framework import serializers



class ParticipantStudyConsentSerializer(serializers.ModelSerializer):

    class Meta:
        model = ParticipantStudyConsent
        fields = (
            'id', 'signature', 'guardian_first_name', 'guardian_last_name',
            'guardian_signature', 'guardian_email')

    def create(self, request):
        """
        Create and return a new `Participant` instance, given the validated data.
        """
        data = request.data
        participant_obj = request.participant_token.participant
        signature = data.get('signature')
        guardian_first_name = data.get('guardian_first_name')
        guardian_last_name = data.get('guardian_last_name')
        guardian_signature = data.get('guardian_signature')
        guardian_email = data.get('guardian_email')
        
        participantconcent_obj = ParticipantStudyConsentApi()._create(participant_obj, signature,
                                                                      guardian_first_name,
                                                                      guardian_last_name,
                                                                      guardian_signature,
                                                                      guardian_email)
        return participantconcent_obj





class ParticipantStudyOptOutSerializer(serializers.ModelSerializer):
    opt_out = serializers.BooleanField(required=True)

    class Meta:
        model = ParticipantStudyConsent
        fields = (
            'id', 'opt_out')

    def update(self, participant_obj, opt_out):
        """
        Update and return an existing `Participant` instance, given the validated data.
        """
        return ParticipantStudyConsentApi()._update(participant_id=participant_obj.id,
                                                    opt_out=opt_out)


class ParticipantSerializer(serializers.HyperlinkedModelSerializer):
    consents = ParticipantStudyConsentSerializer(many=True, read_only=True)

    class Meta:
        model = Participant
        fields = ('id', 'first_name', 'last_name', 'email', 'dob', 'uuid', 'consents', 'join_date', 'gcm_token', 'push_token', 'survey_notification_time', 'enable_notifications',
                  'timezone', 'is_participant', 'werf_url', 'app_os')
        read_only_fields = ('id', 'consents', 'devices', 'uuid', 'join_date',)

    def create(self, validated_data):
        """
        Create and return a new `Participant` instance, given the validated data.
        """

        email = validated_data.get("email")
        first_name = validated_data.get('first_name')
        last_name = validated_data.get('last_name')
        dob = validated_data.get('dob', None)
        gcm_token = validated_data.get('gcm_token', None)
        timezone = validated_data.get('timezone')
        is_participant = validated_data.get('is_participant')
        app_os = validated_data.get('app_os')
        return ParticipantApi()._create(email, first_name, last_name, dob, gcm_token, timezone, is_participant, app_os)

    def update(self, instance, validated_data):
        """
        Update and return an existing `Participant` instance, given the validated data.
        """
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
        instance.email = validated_data.get('email', instance.email)
        instance.dob = validated_data.get('dob', instance.dob)
        instance.gcm_token = validated_data.get('gcm_token', instance.gcm_token)
        instance.push_token = validated_data.get('push_token', instance.push_token)
        instance.survey_notification_time = validated_data.get('survey_notification_time', instance.survey_notification_time)
        instance.enable_notifications = validated_data.get('enable_notifications', instance.enable_notifications)
        instance.timezone = validated_data.get('timezone', instance.timezone)
        instance.is_participant = validated_data.get('is_participant', instance.is_participant)
        instance.save()
        return instance