# -*-coding:utf-8 -*-
from django.shortcuts import render,HttpResponse
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from models import Epave,User,Favoris,Newsforum,MiseEau
from django.db import connection
from django.core import serializers
from django.shortcuts import redirect
from datetime import datetime
from forms import EpaveForm,SearchForm,NewsforumForm,ConnectForm
from django.views.decorators.cache import cache_page
from django.http import HttpResponse
import hashlib

def identification(request):
    userId = request.session.get('userId')
    if not userId:
        return False
    else:
        return True

def home(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    epaves = Epave.objects.all()
    paginator = Paginator(epaves, 1)

    try:
      page = int(request.GET.get('page', '1'))
    except ValueError:
      page = 1

    try:
      epaves = paginator.page(page)
    except (EmptyPage, InvalidPage):
      epaves = paginator.page(paginator.num_pages)

    return render(request, 'bo/home.html', {'epaves': epaves})

def connectok(request):
    return render(request, 'bo/connectok.html', {})

def connect(request):
    if request.method == "POST":
        form = ConnectForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            passwordSHA = hashlib.sha256(password).hexdigest()
            try:
                user = User.objects.get(email=email,password=passwordSHA)
                request.session['userId']=user.id
                #BUG
                return redirect('bo:connectok')
            except User.DoesNotExist:
                #user not found
                return render(request, 'bo/connect.html', {'form':form,'error':'Login/Mot de passe inconnu'})
        else:
            return render(request, 'bo/connect.html', {'form':form,'error':'Non valide'})
    else:
        form = ConnectForm()
    return render(request, 'bo/connect.html', {'form':form,'error':''})

def create(request):
    if request.method == "POST":
        form = ConnectForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            passwordSHA = hashlib.sha256(password).hexdigest()
            try:
                user = User.objects.get(email=email)
                 #user already exists
                return render(request, 'bo/create.html', {'form':form,'error':'Un compte existe déjà.'})
            except User.DoesNotExist:
                #user not found, create it
                user= User(name=email,email=email,password=passwordSHA,gender='',fbPictureUrl='',uuid='',fbUserId='',statusTonight='',status='',valid=1)
                user.save()
                request.session['userId']=user.id
                return redirect('bo:connectok')
        else:
            return render(request, 'bo/create.html', {'form':form,'error':'Non valide'})
    else:
        form = ConnectForm()
    return render(request, 'bo/create.html', {'form':form,'error':''})


def miseEau(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    miseeaux = MiseEau.objects.all()
    return render(request, 'bo/miseeau.html', {'miseeaux': miseeaux})

def getEpaves(request):
    lat = request.GET.get('lat')
    lon = request.GET.get('lon')

    # put in session
    request.session['lat']=lat
    request.session['lon']=lon

    epaves= list()
    formule="(6366*acos(cos(radians("+str(lat)+"))*cos(radians(`latitude`))*cos(radians(`longitude`) -radians("+str(lon)+"))+sin(radians("+str(lat)+"))*sin(radians(`latitude`))))"
    sql = "SELECT *,"+formule+" AS dist FROM epave where valid=1 ORDER by dist ASC limit 0,40"
    # on utilise un cursor pour pouvoir recuperer les champs qui nous interessent
    cursor = connection.cursor()
    cursor.execute(sql)
    for row in cursor.fetchall():
        epave = Epave()
        epave.longitude = row[1]
        epave.latitude = row[2]
        epave.nom = row[3]
        epave.type = row[4]
        epave.totalpoisson = row[9]
        epave.profondeur = row[12]
        epaves.append(epave)

    json_serializer = serializers.get_serializer("json")()
    data =  json_serializer.serialize(epaves, ensure_ascii=False, indent=1, use_natural_keys=True)
    return HttpResponse(data, content_type='application/json')

def mesSpots(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    userId = request.session.get('userId')
    epaves={}
    if userId:
        epaves = Epave.objects.filter(favoris__refuser=userId)
        return render(request, 'bo/mesSpots.html', {'epaves':epaves})
    else:
        return redirect('bo:fbLogin')

def fbLogin(request):
    return render(request, 'bo/account.html', {})

def checkUser(request):
    fbId = request.GET.get('fbId')
    name = request.GET.get('name')
    email = request.GET.get('email')
    gender = request.GET.get('gender')
    birthday = request.GET.get('birthday')
    fbPicture="http://graph.facebook.com/"+fbId+"/picture?type=large"
    the_date = datetime.strptime(birthday, "%m/%d/%Y")
    user = User.objects.filter(fbUserId=fbId)
    if user:
        request.session['userId']=user[0].id
        return HttpResponse("{}", content_type='application/json')
    else:
        user= User(name=name,email=email,password='',gender=gender,birthday=the_date,fbPictureUrl=fbPicture,uuid=fbId,fbUserId=fbId,statusTonight='',status='',valid=1)
        user.save()
        request.session['userId']=user.id
        return HttpResponse("{}", content_type='application/json')



def ajoutEpave(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    if request.method == "POST":
        form = EpaveForm(request.POST)
        # rempli les autres champs
        userId = request.session.get('userId')
        if userId:
            user = User.objects.filter(id=userId)
            form.instance.refuser=user[0]

        form.instance.valid=1
        form.instance.pays=''
        form.instance.dateupdate=datetime.now()
        form.instance.nbvote=0
        form.instance.erreursignalee=0
        form.instance.photo=''
        form.instance.ocean=''
        if form.is_valid():
            form.save(commit=True)
            if userId:
                monepave = Epave.objects.get(refuser=user[0],dateupdate=form.instance.dateupdate)
                # ajoute aux favoris
                favori = Favoris(refuser=user[0],refepave=monepave)
                favori.save()
                return render(request, 'bo/ajoutok.html', {})
            else:
                return render(request, 'bo/merci.html', {})

    else:
        form = EpaveForm()

    return render(request, 'bo/ajoutEpave.html', {'form':form})

def recherche(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    if request.method == "POST":
        form = SearchForm(request.POST)
        if form.is_valid():
            distance = form.cleaned_data['distance']
            type = form.cleaned_data['type']
            poisson = form.cleaned_data['poisson']

            lat = request.session.get('lat')
            lon = request.session.get('lon')
            epaves=list()
            formule="(6366*acos(cos(radians("+str(lat)+"))*cos(radians(`latitude`))*cos(radians(`longitude`) -radians("+str(lon)+"))+sin(radians("+str(lat)+"))*sin(radians(`latitude`))))"
            sql = "SELECT *,"+formule+" AS dist FROM epave where valid=1 and public=1 "

            if type.find(u'indifférent') == -1:
                sql = sql + " and type='"+type+"'"

            if poisson:
                sql = sql + " and totalpoisson>="+poisson

            if distance>0:
                sql = sql + " having dist<="+str(distance)

            sql = sql + " ORDER by dist ASC"
            print sql
            # on utilise un cursor pour pouvoir recuperer les champs qui nous interessent
            cursor = connection.cursor()
            cursor.execute(sql)
            for row in cursor.fetchall():
                epave = Epave()
                epave.longitude = row[1]
                epave.latitude = row[2]
                epave.nom = row[3]
                epave.type = row[4]
                epave.totalpoisson = row[9]
                epave.profondeur = row[12]
                epaves.append(epave)
            return render(request, 'bo/resultatRecherche.html', {'epaves':epaves})
        else:
            return render(request, 'bo/recherche.html', {'form':form})
    else:
        form = SearchForm()

    return render(request, 'bo/recherche.html', {'form':form})

def forum(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    messages={}
    messages = Newsforum.objects.filter(idparent=0).order_by('-datecreation')
    # GEt the picture
    for message in messages:
        try:
            try:
                user = User.objects.get(id=message.iduser)
            except User.DoesNotExist:
                user = User.objects.get(fbUserId=message.iduser)
            message.arrondissement = user.fbPictureUrl
        except User.DoesNotExist:
            print ""
    return render(request, 'bo/forum.html', {'messages':messages})

def forumdetail(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    idmessage = request.GET.get('id')
    messages={}
    messages = Newsforum.objects.filter(idparent=idmessage).order_by('-datecreation')
    # Get the picture
    for message in messages:
        try:
            user = User.objects.get(id=message.iduser)
        except User.DoesNotExist:
            user = User.objects.get(fbUserId=message.iduser)

        message.arrondissement = user.fbPictureUrl

    return render(request, 'bo/forumdetail.html', {'messages':messages,'idParent':idmessage})

def ajoutMessage(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    userId = request.session.get('userId')
    if userId:
        if request.method == "POST":
         form = NewsforumForm(request.POST)
         if form.is_valid():
            title = form.cleaned_data['title']
            message = form.cleaned_data['message']
            lat = request.session.get('lat')
            lon = request.session.get('lon')
            user = User.objects.filter(id=userId)
            form.instance.pseudo = user[0].name
            form.instance.iduser = user[0].id
            form.instance.latitude=lat
            form.instance.longitude=lon
            form.instance.ville = ''
            form.instance.codepostal = ''
            form.instance.arrondissement = ''
            form.instance.idparent=0
            form.instance.blacklist=0
            form.instance.datecreation=datetime.now()
            form.instance.dateupdate=datetime.now()
            form.save()
         return redirect('bo:forum')
        else:
            form = NewsforumForm()
        return render(request, 'bo/ajoutMessage.html', {'form':form})
    else:
        return redirect('bo:fbLogin')

def ajoutMessageDetail(request):
    identifie = identification(request)
    if not identifie:
        return redirect('bo:fbLogin')

    userId = request.session.get('userId')
    idParent = request.GET.get("refParent")
    if userId:
        if request.method == "POST":
         form = NewsforumForm(request.POST)
         if form.is_valid():
            title = form.cleaned_data['title']
            message = form.cleaned_data['message']
            lat = request.session.get('lat')
            lon = request.session.get('lon')
            user = User.objects.filter(id=userId)
            form.instance.pseudo = user[0].name
            form.instance.iduser = user[0].id
            form.instance.latitude=lat
            form.instance.longitude=lon
            form.instance.ville = ''
            form.instance.codepostal = ''
            form.instance.arrondissement = ''
            form.instance.idparent=idParent
            form.instance.blacklist=0
            form.instance.datecreation=datetime.now()
            form.instance.dateupdate=datetime.now()
            form.save()
         return redirect('bo:forum')
        else:
            form = NewsforumForm()
        return render(request, 'bo/ajoutMessageDetail.html', {'form':form})
    else:
        return redirect('bo:fbLogin')
