from django.shortcuts import render
from rest_framework.views import APIView, status
from rest_framework.response import Response
import dateutil.parser

from .api import StudyTokenApi, ParticipantTokenApi
from security.serializers import StudyTokenSerializer
from survey.utils import response_standard

from participant.api import ParticipantApi
import datetime
import logging

#logger = logging.getLogger('phendo-log')
logger = logging.getLogger(__name__)


# Create your views here.
class StudyAPITokenView(APIView):
    def post(self, request, *args, **kwargs):
        serializer = StudyTokenSerializer(data=request.data)
        if serializer.is_valid():
            data = serializer.data
            hash = data["hash"]
            if "expire_on" in data.keys():
                logger.debug("study token data[expire_on]: " + str(data["expire_on"]))
                expire_on = dateutil.parser.parse(data["expire_on"])
                logger.debug("study token expire_on from request after parser: " + str(expire_on))
            else:
                # srlg add tz=timezone.utc to make in timezime aware and remove warning
                #expire_on = datetime.datetime.now() + datetime.timedelta(days=2)
                # we are working in utc time, don't assume now() will return utc !
                expire_on = datetime.datetime.utcnow() + datetime.timedelta(days=2)
                logger.debug("study token expire_on newly created: " + str(expire_on))
            token = StudyTokenApi()._post(hash=hash, expire_on=expire_on)
            if token:
                return Response(response_standard({"token": token.token}),
                                status=status.HTTP_201_CREATED)
        return Response(response_standard({"error": serializer.errors}),
                                status=status.HTTP_400_BAD_REQUEST)

class ParticipantAPITokenView(APIView):
    """
    This is a custom view that can be anything at all. It's not using a serializer class,
    but I can define my own parameters like so!
    horse -- the name of your horse
    """

    def post(self, request, *args, **kwargs):
        study_token = request.study_token
        logger.debug('in ParticipantAPITokenView request.study_token:' + str(study_token))
        data = request.data
        logger.debug('request.data:' + str(data))
        #print data
        participant_id = data["participant_id"]
        try:
            participant = ParticipantApi()._get(uuid=participant_id)
        except:
            logger.error("Participant not found: " + str(participant_id))
            return Response(response_standard({"error": "Participant not found"}),
                            status=status.HTTP_400_BAD_REQUEST)
        hash = data["hash"]
        if "expire_on" in data.keys():
            logger.debug("data[expire_on]: " + str(data["expire_on"]))
            expire_on = dateutil.parser.parse(data["expire_on"])
            logger.debug("expire_on from request after parser: " + str(expire_on))
        else:
            expire_on = datetime.datetime.utcnow() + datetime.timedelta(days=2)
            logger.debug("expire_on newly created: " + str(expire_on))
        token = ParticipantTokenApi()._post(
            participant=participant,
            hash=hash,
            study_token=study_token,
            expire_on=expire_on)
        if token is False:
            logger.error("Participant %s Token not generated" , str(participant_id))
            return Response(response_standard({"error": "Token not generated"}),
                            status=status.HTTP_400_BAD_REQUEST)
        else:
            logger.debug("Participant %s Token generated", str(participant_id))
            return Response(response_standard({"token": token.token}),
                            status=status.HTTP_201_CREATED)
