# -*-coding:utf-8 -*-
from django.contrib.auth import get_user_model
from django.contrib.auth.tokens import default_token_generator
from django.db.models.query_utils import Q
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.template import loader
from django.core.validators import validate_email
from django.core.exceptions import ValidationError
from django.core.mail import send_mail
from Agender.settings import DEFAULT_FROM_EMAIL
from django.views.generic import *
from .forms import SetPasswordForm
from django.contrib import messages
#from django.contrib.auth.models import User
from backoffice.models import User
from django.http import HttpResponse
import hashlib
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
import sendgrid
from Agender import settings
def sendMessageEmail(email,subject,message):
    ### SEND WELCOME TEMPLATE EMAIL
    sg = sendgrid.SendGridAPIClient(apikey=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 HttpResponse('OK')

def reset_password(user, request):
    print("On recoit demande========")
    email = user.email
    subject="Agender : Ré initialisation du mot de passe"
    uid = urlsafe_base64_encode(force_bytes(user.pk)).decode('utf-8')
    token= default_token_generator.make_token(user)
    message="Pour changer votre mot de passe, merci de suivre le lien suivant: https://www.agender.fr/account/reset_password_confirm/"+uid+"/"+token
    sendMessageEmail(email,subject,message)
    """
    c = {
        'email': user.email,
        'domain': request.META['HTTP_HOST'],
        'site_name': 'Agender',
        'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode('utf-8'),
        'user': user,
        'token': default_token_generator.make_token(user),
        'protocol': 'http',
    }
    print("PK UID %s"%user.pk)
    subject_template_name = 'registration/password_reset_subject.txt'
    # copied from
    # django/contrib/admin/templates/registration/password_reset_subject.txt
    # to templates directory
    email_template_name = 'registration/password_reset_email.html'
    # copied from
    # django/contrib/admin/templates/registration/password_reset_email.html
    # to templates directory
    subject = loader.render_to_string(subject_template_name, c)
    # Email subject *must not* contain newlines
    subject = ''.join(subject.splitlines())
    email = loader.render_to_string(email_template_name, c)
    print("On fait demande ENVOI MAIL ======== %s" % user.email)
    send_mail(subject, email, DEFAULT_FROM_EMAIL,[user.email], fail_silently=False)
"""


@csrf_exempt
def sendPasswordLink(request):
    if request.method == "GET":
        data = request.GET['email_or_username']
        associated_users = User.objects.filter(Q(email=data) | Q(username=data))
        try:
         if associated_users.exists():
                for user in associated_users:
                    reset_password(user, request)
                return HttpResponse(status=200)
        except Exception as e:
                print(e)
        return HttpResponse(status=404)
    else:
        return HttpResponse(status=404)

def pwdenvoye(request):
    return render(request,'account/pwdmodifie.html',{})

class PasswordResetConfirmView(FormView):
    template_name = "account/pwdoublie.html"
    success_url = '/account/pwdenvoye'
    form_class = SetPasswordForm

    def post(self, request, uidb64=None, token=None, *arg, **kwargs):
        """
        View that checks the hash in a password reset link and presents a
        form for entering a new password.
        """
        form = self.form_class(request.POST)
        assert uidb64 is not None and token is not None  # checked by URLconf
        try:
            uid = urlsafe_base64_decode(uidb64)
            user = User.objects.get(pk=uid)
        except (TypeError, ValueError, OverflowError, User.DoesNotExist):
            user = None

        if user is not None and default_token_generator.check_token(user, token):
            if form.is_valid():
                new_password = form.cleaned_data['new_password2']

                user.password = hashlib.sha256(new_password.encode('utf8')).hexdigest()
                user.save()
                messages.success(request, 'Votre mot de passe a été modifié.')
                return self.form_valid(form)
            else:
                messages.error(
                    request, 'Merci de vérifier vos mots de passe.')
                return self.form_invalid(form)
        else:
            messages.error(
                request, 'Ce lien a expiré. Merci de refaire une demande.')
            return self.form_invalid(form)

