# *coding: utf-8*
from backoffice.models import *
from datetime import datetime,timedelta
from datetime import datetime,timedelta
import requests
import logging
from django.utils import timezone
from fcm_django.models import FCMDevice
import sendgrid
from fcm_django.fcm import FCMError
from PIL import Image
import os, sys
# Get an instance of a logger
logger = logging.getLogger('django')

def envoiMessageMail(email,message,subject):
    sg = sendgrid.SendGridAPIClient(settings.SENDGRID_API_KEY)
    data = {
        "personalizations": [
            {
                "to": [
                    {
                        "email": email
                    }
                ],
                "subject": subject
            }
        ],
        "from": {
            "email": "Agender <csurbier@idevotion.fr>"
        },
        "content": [
            {
                "type": "text/html",
                "value": "<strong>"+message+"</strong>"
            }
        ],

        "template_id": settings.MESSAGE_TEMPLATE_ID
    }
    response = sg.client.mail.send.post(request_body=data)
    return

def checkUserOnlineForOneHour():
    today = timezone.now()
    oneHourAgo = today - timedelta(minutes=60)
    users = User.objects.filter(online=True,lastConnexionDate__lte=oneHourAgo)
    for theUser in users:
        theUser.online = False
        theUser.save()

def checkEventStillAvailable():
    today = datetime.now().date()
    eventPerimes = Event.objects.filter(dateEvent__lte=today, automaticDelete=True)
    for event in eventPerimes:
        if event.isWeekly:
            logger.info("on reprogramme %s",event)
            event.dateEvent = event.dateEvent+timedelta(days=7)
            event.save()
        else:
            logger.info("On efface event périmé %s", event)
            event.delete()
    eventDaily = Event.objects.filter(dateEvent__lte=today, automaticDelete=False)
    for event in eventDaily:
        if event.isDaily:
            logger.info("on reprogramme %s", event)
            event.dateEvent = today
            event.save()
        else:
            # on passe invalide
            event.valid=False
            event.save()
    """
    allEvents = Event.objects.all()
    for event in allEvents:
        urlPicture = event.picture.name
        if "https" in urlPicture or "http" in urlPicture:
            #print("urlPicture %s" % urlPicture)
            response = requests.head(urlPicture)
            if response.status_code == 200:
                pass
                #print("ok image existe %s" % urlPicture)
            else:
                print('erreur url %s %s ' % (event.name, event.picture))
                event.picture = ''
                event.save()
                """

    envoiMessageMail("csurbier@idevotion.fr","Traitements celery effectue","Batch Agender")
    return


def sendNotifications():
    # On récupére tous les messages à envoyer (status = 0, notifType = 0)
    notifsToSend = NotificationToSend.objects.filter(status=0,notifyType=0)
    for theNotif in notifsToSend:
        user = theNotif.toUserId
        if user.ios and user.pushToken and user.acceptPush:
            try:
                device = FCMDevice.objects.get(registration_id=user.pushToken, active=True)
                if device:
                    device.send_message(title="Agender", body=theNotif.message, badge=1, sound="default",
                                        data={"title": "Agender", "body": theNotif.message})
                    logger.info("on envoi message a utilisateur %s" % (user))
                    theNotif.status = 2
                    theNotif.save()
                else:
                    theNotif.status = 3
                    theNotif.save()

            except Exception as e:
                logger.error("Impossible d'envoyer push une exception est survenue %s", e)
                theNotif.status = 3
                theNotif.save()

        elif user.android and user.pushToken and user.acceptPush:
            try:
                device = FCMDevice.objects.get(registration_id=user.pushToken, active=True)
                if device:
                    device.send_message(title="Agender", body=theNotif.message, badge=1, sound="default",
                                        click_action="FCM_PLUGIN_ACTIVITY",
                                        data={"title": "Agender", "body": theNotif.message})
                    logger.info("on envoi message a utilisateur %s" % (user))
                    # On passe la notif au status Envoye
                    theNotif.status = 2
                    theNotif.save()
                else:
                    theNotif.status = 3
                    theNotif.save()
            except Exception as e:
                logger.error("Impossible d'envoyer push une exception est survenue %s", e)
                theNotif.status = 3
                theNotif.save()
        else:
            #cancel notification
            theNotif.status=4
            theNotif.save()



def resizeImage():
    path = settings.MEDIA_ROOT + "media/"
    basewidth = 300
    for root, dirnames, filenames in os.walk(path):
        for filename in filenames:
            # for item in dirs:

            try:
                origine = os.path.join(root, filename)
                # logger.info("On veut ouvrir %s" % origine)
                im = Image.open(origine)
                width, height = im.size
                if width > 300:
                    try:
                        destination = os.path.join(root, filename)
                        logger.info("TO_RESIZE: on a %s et %d %d => %s", origine, width, height, destination)
                        wpercent = (basewidth / float(im.size[0]))
                        hsize = int((float(im.size[1]) * float(wpercent)))
                        im = im.resize((basewidth, hsize), Image.ANTIALIAS)
                        im.save(destination)
                        logger.info("Resize done et sauve %s" % destination)
                        im.close()
                    except Exception as e:
                        pass
            except IOError as e:
                logger.error("Error resize %s" % e)
                pass

def checkUrl():
    # Fetch all events
    allEvents = Event.objects.all()
    for event in allEvents:
        urlPicture = event.picture.name
        if "https" in urlPicture or "http" in urlPicture:
            #print "urlPicture %s" % urlPicture
            response = requests.head(urlPicture)
            if response.status_code == 200:
                pass
            else:
                #print('erreur url %s %s ' % (event.name, event.picture))
                #envoi mail julien
                message="L'event "+event.name+" sur la ville "+event.refTown+" n a plus d'image"
                message+="Url de l'event : <a href=\"https://www.agender.fr/admin/backoffice/event/"+event.id+"/change/\">"+event.name+"</a>"
                envoiMessageMail("juliengruberg75@gmail.com", message, "Agender: image manquante")