from participant.models import Participant, ParticipantStudyConsent
import random
import string
from django.utils import timezone

__author__ = 'aamirbhatt'

import logging
logger = logging.getLogger(__name__)


class ParticipantApi(object):
    def _get(self, id=None, uuid=None, email=None, reset_code=None, email_verification_code=None):
        try:
            if id:
                return Participant.objects.get(id=id)
            if uuid:
                return Participant.objects.get(uuid=uuid)
            if email:
                return Participant.objects.get(email=email)
            if reset_code:
                return Participant.objects.get(reset_code=reset_code)
            if email_verification_code:
                return Participant.objects.get(email_verification_code=email_verification_code)
        except:
            return None

    def _create(self, email, first_name, last_name, dob, gcm_token=None, timezone=None, is_participant=True, app_os=None):
        participant_obj, is_created = Participant.objects.get_or_create(email=email)

        participant_obj.first_name = first_name
        participant_obj.last_name = last_name
        participant_obj.timezone = timezone
        participant_obj.is_participant = is_participant
        if dob:
            participant_obj.dob = dob
        if gcm_token:
            participant_obj.gcm_token = gcm_token
        if app_os:
            participant_obj.app_os = app_os
        participant_obj.save()

        if is_created:
            logger.debug("Created participant: %d  uuid: %s email: %s", participant_obj.id, participant_obj.uuid, email)
        else:
            logger.debug("create failed for participant: %s", email)

        return participant_obj

    def _update(self, participant_id, email_verified=False,
                email_verification_code=None, consent_doc_emailed=False, gcm_token=None, is_participant=None):
        participant = self._get(id=participant_id)
        if email_verification_code:
            participant.email_verification_code = email_verification_code
            participant.save()

        if consent_doc_emailed:
            participant.consent_doc_emailed = True
            participant.save()

        if email_verified:
            participant.email_verified = True
            participant.email_verification_date = timezone.now()
            participant.save()

        if gcm_token:
            participant.gcm_token = gcm_token
            participant.save()

        if is_participant:
            participant.is_participant = is_participant
            participant.save()
            
        return participant

    def _filter(self, uuid=None):
        participants = Participant.objects
        if uuid:
            participants = participants.filter(uuid=uuid)
            logger.debug("filtering participant: %s", uuid)


        return participants.all()

    def _updatecode(self, email):
        participant = self._get(email=email)
        choices = list(string.ascii_uppercase) + list(string.digits)
        for x in ['L', 'I', 'O', '0']:
            choices.remove(str(x))
        code = ''.join(random.choice(choices) for _ in range(0, 6))
        participant.reset_code = code
        participant.reset_code_created_date = timezone.now()
        participant.save()
        return code


class ParticipantStudyConsentApi(object):
    def _create(self, participant_obj, signature, guardian_first_name=None, guardian_last_name=None,
                guardian_signature=None, guardian_email=None):
        participantconcent_obj, is_created = ParticipantStudyConsent.objects.get_or_create(
            participant=participant_obj, signature=signature)
        if guardian_first_name:
            participantconcent_obj.guardian_first_name = guardian_first_name
        if guardian_last_name:
            participantconcent_obj.guardian_last_name = guardian_last_name
        if guardian_signature:
            participantconcent_obj.guardian_signature = guardian_signature
        if guardian_email:
            participantconcent_obj.guardian_email = guardian_email
        participantconcent_obj.save()
        return participantconcent_obj

    def _update(self, participant_id, opt_out=None):
        participantconcent_obj = ParticipantStudyConsent.objects.filter(participant__id=participant_id).last()
        if opt_out is not None:
            participantconcent_obj.opt_out = opt_out
        participantconcent_obj.save()
        return participantconcent_obj

    def _get(self, participant_id):
        return ParticipantStudyConsent.objects.filter(participant__id=participant_id).last()