from django.core.management import BaseCommand
from apns import APNs, Frame, Payload
import datetime
from django.utils import timezone
from participant.api import ParticipantApi
from participant.models import Participant
from participant.models import ParticipantNotificationsSent
from participant.views import FcmNotification
from survey.api import ObservationApi
from django.conf import settings
import os
import random

__author__ = 'nick'

class Command(BaseCommand):

    def handle(self, *args, **kwargs):

        apns = APNs(use_sandbox=getattr(settings, 'APNS_SANDBOX'), cert_file=getattr(settings, 'APNS_CERT_FILE'))
        survey_list_to_check = [5]
        date = timezone.now().replace(minute=0, second=0, microsecond=0)
        
        disabled_notifications = Participant.objects.filter(enable_notifications=0)
        participants = Participant.objects.raw("""
           SELECT DISTINCT DATE(entry_date), participant_id AS id, DATEDIFF(CURDATE(), DATE(entry_date)) AS days FROM survey_observation, participant_participant WHERE participant_participant.id = survey_observation.participant_id AND DATEDIFF(CURDATE(), DATE(entry_date)) < 6 
           AND participant_id NOT IN (%s) AND EXTRACT(HOUR FROM CONVERT_TZ(%s, 'UTC', participant_participant.timezone)) = 8 GROUP BY participant_id, DATE(entry_date) ORDER BY DATE(entry_date) DESC""", 
            [
            ",".join([str(participant.id) for participant in disabled_notifications]) if disabled_notifications.count() > 0 else "0",
            date.strftime('%Y-%m-%d %H:%M:%S')
            ])
        consecutive_days = {}
        for participant in participants:
            print participant.days, participant.id
            if participant.id in consecutive_days and consecutive_days[participant.id]+ 1 == participant.days:
                consecutive_days[participant.id] = participant.days
            else:
                if participant.days == 1:
                    consecutive_days[participant.id] = 1
        for participant, day in consecutive_days.iteritems():
            message = None
            notification = None
            notify = False
            # 3 Days
            if day == 3:
                message = "Woohoo! You've tracked 3 days, make it 4!"
                notification = "three_days_tracked"
            # 4 days
            if day == 4:
                message = "Thank you for contributing to endo research! Keep it up!"
                notification = "four_days_tracked"
            # 6 days
            if day == 6:
                message = "Phendo loves you! You're a star contributor!"
                notification = "six_days_tracked"

            if notification and message:
                if not ParticipantNotificationsSent.objects.filter(
                    participant=participant.id,date=date,notification=notification).exists():
                    if Participant.objects.get(id=participant.id).push_token:
                        payload = Payload(
                                        alert=message,
                                        sound="default",
                                        badge=1)
                        token_hex = Participant.objects.get(id=participant.id).push_token
                        apns.gateway_server.send_notification(token_hex, payload)
                        notify = True
                    if Participant.objects.get(id=participant.id).gcm_token:
                        registration_ids = [Participant.objects.get(id=participant.id).gcm_token]
                        FcmNotification().send_message(title="Daily Notification", body=message, registration_ids=registration_ids)
                        notify = True
                    if notify:
                        notification = ParticipantNotificationsSent(participant=participant.id,date=date,notification=notification)
                        notification.save()