#-*- coding: utf-8 -*-
from django.shortcuts import render
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse
from backoffice.models import *
from backoffice.forms import TokenForm
from django.shortcuts import redirect, render_to_response
from django.views import View
from django.template import RequestContext
from django.shortcuts import render
from datetime import datetime,timedelta
from django.utils import timezone
import dateutil.parser as dateparser
from django.contrib.gis.geos import Point
from django.template.defaultfilters import slugify
from dateutil.parser import parse
import logging
# Get an instance of a logger
logger = logging.getLogger('django')

def robust_decode(bs):
    if bs is None:
        return ''
    if type(bs) is dict:
        logger.info("on a dico !!!!")
        for element in bs:
            logger.info("Element %s"%element)
    else:
        return bs
        """
        cr = None
        try:
            cr = bs.decode('utf8')
        except Exception as e:
            logger.info("==== decode UTF8 erreur pour %s essaye en latin1 car %s"%(u''+bs,e))
            cr =  bs.decode('latin1')
        logger.info("--On renvoi %s" % (cr))
        return cr
"""


def run():
    eventFB = {u'name': u'Tous les jeudis - Kinky Room', u'start_time': u'2019-05-30T23:00:00+0200', u'cover': {u'source': u'https://scontent.xx.fbcdn.net/v/t1.0-9/s720x720/61308256_2154377924853029_8300593386981687296_n.jpg?_nc_cat=101&_nc_oc=AQn4PWedFX6gVl02kaxpsAWSQy4OGd2iXozqGEDHoO4Qb7K4tpfnqq-bxe-48USkBaA&_nc_ht=scontent.xx&oh=d2fa399b8d35111e146e6017b3bafd7d&oe=5D8EFAB0', u'offset_x': 50, u'offset_y': 50, u'id': u'2154377918186363'}, u'place': {u'id': u'1376663972624432', u'name': u'LE DEPOT', u'location': {u'city': u'Paris', u'zip': u'75003', u'country': u'France', u'longitude': 2.35144, u'street': u'10 rue aux ours', u'latitude': 48.86339}}, u'end_time': u'2019-07-19T06:00:00+0200', u'id': u'443875886398777', u'description': u'\u26d3 KINKY ROOM \u26d3\n\nLa soir\xe9e qui met les mecs look\xe9s \xe0 l\u2019honneur !\n\nDJs r\xe9sidents : Cyril Cortez, Gorkem Han, DJ Little Nemo\n\nEntr\xe9e, vestiaire et shot offert pour les mecs look\xe9s : en cuir, latex, jockstrap ou nus.\n\nInvitations: www.sexygroup.fr\n\nLE DEPOT\n10, Rue aux Ours\n75003 Paris'}
    try:
        facebookId = robust_decode(eventFB['id'])
        logger.info("Event %s %s" % (facebookId, robust_decode(eventFB['name'])))
        eventExit = Event.objects.filter(facebookId=facebookId)
        if len(eventExit) > 0:
            # pass
            logger.info("----- %s deja existant %s" % (robust_decode(eventFB['name']), facebookId))
        else:
            # evenement
            # logger.info("------ Pas dejà ---")
            startTime = eventFB['start_time']
            if "end_time" in eventFB:
                endTime = eventFB['end_time']
            else:
                endTime = startTime
            dateParseDeb = parse(startTime, ignoretz=False)
            dateParseFin = parse(endTime, ignoretz=False)
            timeDuration = dateParseFin - dateParseDeb
            tempsTotal = timeDuration.total_seconds() / 86400
            # logger.info("On a endTime")
            today = datetime.now().date()
            todayFull = timezone.now()

            startDate = dateparser.parse(startTime)
            endDate = dateparser.parse(endTime)
            logger.info("---- Today %s start Time %s et endDate %s et todayFull %s" % (
            today, startDate.date(), endDate, todayFull))

            # à venir ?
            if today <= startDate.date() or endDate >= todayFull:
                try:
                    # Futur
                    event = Event()
                    event.startDateEvent = dateParseDeb
                    event.endDateEvent = dateParseFin
                    if tempsTotal > 1:
                        event.requireAttention = True
                        event.isDaily = True
                    event.name = robust_decode(eventFB['name'])
                    logger.info("Recup name event %s" % eventFB)
                    """
                    "event_times": [
                        {
                          "id": "1833957610240733",
                          "start_time": "2018-08-25T15:00:00+0200",
                          "end_time": "2018-08-25T18:00:00+0200"
                        },
                    """
                    if 'event_times' in eventFB:
                        eventTimes = eventFB['event_times']
                        logger.info("--- Event multiple date %s" % eventTimes)
                        for theDate in eventTimes:
                            dateDeb = theDate["start_time"]
                            dateFin = theDate["end_time"]

                            parseDateDeb = dateparser.parse(dateDeb)
                            parseEndDate = dateparser.parse(dateFin)
                            if today <= parseDateDeb.date():
                                logger.info("--Ok trouve prochaine date %s" % parseDateDeb)
                                event.dateEvent = parseDateDeb
                                break
                            elif parseEndDate.date() >= today:
                                logger.info("--Ok trouve prochaine date %s" % today)
                                event.dateEvent = today
                                break
                    else:
                        if startDate.date() < today:
                            # sur plusieurs jours
                            event.dateEvent = today
                            event.isDaily = True
                            event.requireAttention = True
                            logger.info("Event sur plusiers jours on met date today")
                        else:
                            event.dateEvent = startDate - timedelta(minutes=60)  # Remove 1hour
                    if "description" in eventFB:
                        event.description = eventFB['description']
                        # logger.info("REcup description event %s" % event.description)
                    else:
                        event.description = ''
                    if "cover" in eventFB:
                        cover = eventFB['cover']
                        if "source" in cover:
                            event.picture = cover['source']
                        else:
                            logger.info("cover %s" % cover)
                            event.picture = ''
                    else:
                        event.picture = ''
                    city = None
                    latitude = None
                    name = None
                    placeName = None
                    if "place" in eventFB:
                        if "name" in eventFB["place"]:
                            placeName = robust_decode(eventFB['place']['name'])
                        if "location" in eventFB['place']:
                            city = robust_decode(eventFB['place']['location']['city'])
                            if "street" in eventFB['place']['location']:
                                event.street = robust_decode(eventFB['place']['location']['street'])
                            else:
                                event.street = ''
                            if "zip" in eventFB['place']['location']:
                                event.zipCode = robust_decode(eventFB['place']['location']['zip'])
                            else:
                                event.zipCode = ''
                            event.pageFacebook = 'https://www.facebook.com/events/' + facebookId
                            if "latitude" in eventFB['place']['location']:
                                latitude = robust_decode(eventFB['place']['location']['latitude'])
                                longitude = robust_decode(eventFB['place']['location']['longitude'])
                        else:
                            if "name" in eventFB["place"]:
                                name = eventFB["place"]["name"]
                                if "Paris" in name:
                                    city = "Paris"
                                elif "Barcelona" in name:
                                    city = "Barcelona"
                                elif "Madrid" in name:
                                    city = "Madrid"
                                elif "London" in name:
                                    city = "London"
                                elif "Sitges" in name:
                                    city = "Sitges"
                                elif "Berlin" in name:
                                    city = "Berlin"
                                elif "Brussels" in name:
                                    city = "Brussels"
                                elif "LE DEPOT" in name:
                                    city = "Paris"
                                else:
                                    city = "Inconnu"
                                    logger.error("Pas de location %s Name %s" % (eventFB, name))

                            else:
                                logger.error("Pas de location et pas de name")

                        """
                            exemple
                            u'place': {u'name': u'Place de la R\xe9publique, 75011 Paris, France'}, 
                            """

                    else:
                        placeName = ''
                    if latitude is None:
                        longitude = 0
                        latitude = 0

                    if not city:
                        city = "Inconnu"

                    if city:
                        if city == 'Barcelona':
                            event.refTown = Town.objects.get(pk=1)
                        elif city == 'Berlin' or city == u'Neukölln':
                            event.refTown = Town.objects.get(pk=2)
                        elif city == 'London':
                            event.refTown = Town.objects.get(pk=3)
                        elif city == 'Paris':
                            event.refTown = Town.objects.get(pk=4)
                        elif city == 'Sitges':
                            event.refTown = Town.objects.get(pk=5)
                        elif city == 'Brussels':
                            event.refTown = Town.objects.get(pk=6)
                        elif city == 'Madrid':
                            event.refTown = Town.objects.get(pk=8)
                        elif city == "Inconnu":
                            event.refTown = Town.objects.get(pk=9)
                        event.refEventCategory = EventCategory.objects.get(pk=1)  # Clubbing
                        # Recuperation place si existe
                        try:
                            places = Place.objects.filter(refTown=event.refTown, name=placeName)
                            if places:
                                place = places[0]
                                event.refPlace = place
                            else:
                                event.refPlace = Place.objects.get(pk=0)  # Unknown
                        except Exception as e:
                            logger.error(e)
                            event.refPlace = Place.objects.get(pk=0)
                        # Create slug
                        event.slug = slugify(event.name)
                        # create point
                        pnt = Point(longitude, latitude)
                        event.location = pnt
                        event.placeName = placeName
                        event.valid = True
                        # ville ?
                        # event.refTown = place.refTown
                        # event.refPlace = None
                        event.facebookId = eventFB['id']
                        event.save()
                        logger.info("--- Importe ID %s event [%s] startDate [%s]" % (
                            u'' + event.facebookId, u'' + event.name, event.dateEvent))
                    else:
                        logger.info("---- Non importe car ville inconnue %s name %s" % (eventFB, name))
                except Exception as e:
                    logger.error("!!!!!!!! ERREUR EVENT %s" % eventFB)
                    logger.error(e)

                # logger.info("Ok on a cree Event %s"%event)
            # else:
            #    logger.info("----Dans PASSE  Today %s start Time %s event %s" % (today, startDate.date(),eventFB))
    except Exception as e:
        logger.error("!!!!!!!! ERREUR LIST EVENT %s" % eventFB)
        logger.error(e)
