from base64 import urlsafe_b64decode, urlsafe_b64encode
from collections import namedtuple
from email.mime import image
from tkinter import image_names
from tokenize import group
#from turtle import position
from django import views

from django.http import BadHeaderError, HttpResponse
from django.http import JsonResponse
import json
from django.core import serializers

from .token import generate_tokens
from django.conf import settings
from django.contrib import messages

from django.contrib.auth import authenticate, login
from django.contrib.auth import logout as log_out

from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.models import User
from django.contrib.auth.models import Group

from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import EmailMessage
from django.core.mail import send_mail
from django.shortcuts import redirect, render
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes, force_str


from django.contrib.auth import update_session_auth_hash
from .forms import UserForgotPasswordForm, UserPasswordResetForm, UserForm, ProfileForm, MemberImg
from django.contrib.auth.hashers import make_password

###### Excel export-Import ###########
from .resources import PersonResource
from tablib import Dataset
from .models import Profile

import os


def home(request):
    vissza_adat = {}
    if request.user.is_authenticated:
        #print(request.user)
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()
    

    current_site = 'home'
    vissza_adat['domain'] = current_site
    vissza_adat['title'] = 'MMKSZ Felvétel indul!'

    return render(request, 'user_auth_app/home.html', vissza_adat)



##################x ÚJ FELHSZNÁLÓ REGISZTRÁLÁSA ###########XXX
def registration(request):
    vissza_adat = {}
    tag={}
   
    if request.user.is_authenticated:
        #print(request.user)
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()

    if request.method == 'POST':
       
        u_form = UserForm(request.POST)
        p_form = ProfileForm(request.POST, request.FILES)
        if u_form.is_valid() and p_form.is_valid():
            
            myuser = u_form.save()
            p_form = p_form.save(commit=False)
            p_form.user = myuser
            myuser.is_active = False
            my_group = Group.objects.get(name='Tag') 
            my_group.user_set.add(myuser)
            myuser.save()
            p_form.save()
            
            current_site = get_current_site(request)
            email_subject = "MMKSZ Regisztració"
            message2 = render_to_string('user_auth_app/emails/email_conf.html',{
                'name': myuser.first_name,
                'username' : myuser.username,
                'domain': current_site.domain,
                'uid': urlsafe_b64encode(force_bytes(myuser.pk)),
                'token': generate_tokens.make_token(myuser)
                })
            email = EmailMessage(
                email_subject,
                message2,
                settings.EMAIL_HOST_USER,
                [myuser.email]
                
                 )
            try:
                email.send()
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            messages.success(request, 'Sikeres regisztráció, küldtünk egy megerősítő emailt!')
            return redirect('login')
        else:
           
            messages.error(request, 'A regisztráció nem sikerült!')
    else:
        u_form = UserForm(request.POST)
        p_form = ProfileForm(request.POST)

    vissza_adat['title'] ='MMKSZ Regisztració'
    vissza_adat['u_form'] =u_form
    vissza_adat['p_form'] =p_form
    #return render(request, 'user_auth_app/registration.html', {'title':'MMKSZ Regisztració', 'u_form': u_form, 'p_form': p_form})
    return render(request, 'user_auth_app/registration.html', vissza_adat)

def activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_b64decode(uidb64[1:]))
        myuser = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        myuser = None

    if myuser is not None and generate_tokens.check_token(myuser, token):
        # myuser.profile.email_confirmed = True
        myuser.is_active = True
        myuser.save()
        login(request,myuser)
        messages.success(request, "A profilodat sikeresen aktiváltuk!")
        return redirect('home')
    else:
        return render(request,'user_auth_app/activation_failed.html')   

def signin(request):
    vissza_adat = {}
    vissza_adat['title'] = 'Bejelentkezés'
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            myuser =  User.objects.get(username=username)
        except:
            myuser = None

        user = authenticate(username=username, password=password)
        ################## HA NEM AKTÍV ############
        if myuser.is_active:
            if user is not None:
                login(request, user)
                user_detail = User.objects.filter(id=user.id)
                vissza_adat['first_name'] = user.first_name
                vissza_adat['title'] = 'MMKSZ'
                vissza_adat['user_detail'] =user_detail
                vissza_adat['vezeto'] = user.groups.filter(name='Vezeto').exists()
                messages.success(request, "Sikeres bejelentkezés!")
                return render(request, 'user_auth_app/home.html', vissza_adat)
            else:
                messages.error(request, 'Rossz felhasználónév vagy jelszó')
                return redirect('login')
        else:
            messages.error(request, 'Nem aktíváltad a profilod, kérlek kövesd az e-mailban kapott lépéseket!')
            return redirect('login')
    form = AuthenticationForm()
    vissza_adat['form'] = form
    return render(request, 'user_auth_app/login.html', vissza_adat)


def reset(request):
    vissza_adat = {}
    vissza_adat['title'] = 'Új jelszó'
    if request.method == 'POST':
        form = UserForgotPasswordForm(request.POST)
        if form.is_valid:
            try:
                email_add = request.POST.get('email')
                myusers = User.objects.get(email=email_add)
            except: 
                ######## HA NINCS USER #######
                myusers = None
           
            if myusers is not None:
                myusers.is_active = False
                myusers.password = ''
                myusers.save()
                ######### EMAIL KÜLDÉS #########
                current_site = get_current_site(request)
                email_subject = "MMKSZ Új jelszó igénylés"
                message2 = render_to_string('user_auth_app/emails/pass_reset_mail.html',{
                    'name': myusers.first_name,
                    'domain': current_site.domain,
                    'uid': urlsafe_b64encode(force_bytes(myusers.pk)),
                    'token': generate_tokens.make_token(myusers)
                })
                email = EmailMessage(
                    email_subject,
                    message2,
                    settings.EMAIL_HOST_USER,
                    [myusers.email]
            
                    )
                email.send()
                return render(request,'user_auth_app/emails/pass_reset_mail_send.html')
            else:
                
                ########## NINCS ILYEN FELHASZNÁLÓ ##########
                messages.error(request, 'Nincs ilyen regisztrált e-mail cím')
                return redirect('reset')
        else:
            # NEM jó az ürlap
            return render(request,'user_auth_app/activation_failed.html')
    form = UserForgotPasswordForm()
    vissza_adat['form'] = form
    return render(request, 'user_auth_app/pass_reset.html', vissza_adat)


def mail_activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_b64decode(uidb64[1:]))
        myuser = User.objects.get(pk=uid)
        
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        myuser = None
    
    if request.method == 'POST':
        password = request.POST.get('new_password1')
        myuser.password = make_password(password)

        update_session_auth_hash(request, myuser)
        myuser.is_active = True
        myuser.save()
        return redirect('login')
    else:
        if myuser is not None and generate_tokens.check_token(myuser, token):
            vissza_adat = {}
            vissza_adat['title'] = 'Jelszó visszaállítás'
            form = UserPasswordResetForm(myuser)
            vissza_adat['form'] = form
            vissza_adat['user'] = myuser.username
            return render(request,'user_auth_app/new_pass.html', vissza_adat)
        else:
            ###### Ha nem jó aktivacio #######
            return render(request,'user_auth_app/activation_failed.html') 
    

def new_pass(request):
    vissza_adat = {}
    vissza_adat['title'] = 'Új jelszó'
    vissza_adat['form'] = UserPasswordResetForm()
    
    return render(request, 'uer_auth_app/new_pass.html',vissza_adat)


def reset_down(request):
    vissza_adat = {}
    vissza_adat['title'] = 'Jelszó reszet'    
    return render(request, 'user_auth_app/pass_reset_down.html', vissza_adat)


def reset_mail_send(request):
    vissza_adat = {}
    vissza_adat['title'] = 'Jelszó visszaálítás'
    return render(request, 'user_auth_app/reset_mail_send.html')


def logout(request):
    log_out(request)
    return redirect('home')


############################### TAGOK LISTÁZÁSA MÓDOSÍTÁSA #######################
def tagok(request):
    vissza_adat = {}
    csop={}
    if request.user.is_authenticated:
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()
        
        kereses = False

        if request.META.get('HTTP_X_REQUESTED_WITH')=="XMLHttpRequest":
            if request.method == "GET":

                # member = User.objects.get(id=request.GET.get("memberid"))
                member = User.objects.get(id=request.GET.get("memberid"))

                group_set = Group.objects.filter(user = member.pk)
                member_prof = Profile.objects.get(user = member.pk)

                for g in group_set:
                    csop = g.pk


                serialized_member = serializers.serialize('json', [member,])
                serialized_prof = serializers.serialize('json', [member_prof,])
                return JsonResponse({"member" : serialized_member, "ser_prof":serialized_prof, "csoport": csop})

            if request.method == "POST":

                member_ch = User.objects.get(id=request.POST.get('memid'))
                member_ch_prof = Profile.objects.get(user=request.POST.get('memid'))
                member_ch.username=request.POST.get('username')
                member_ch.last_name=request.POST.get('last_name')
                member_ch.first_name=request.POST.get('first_name')
                member_ch.email=request.POST.get('email')


                if request.POST.get('CB_aktiv') == "true":
                    member_ch.is_active= True
                else:
                    member_ch.is_active= False
                

                member_ch.groups.clear()
                if request.POST.get('group_select') == "tag":
                    group = Group.objects.get(name="Tag")
                    group.user_set.add(member_ch)

                else:
                    group = Group.objects.get(name="Vezeto")
                    group.user_set.add(member_ch)

                member_ch_prof.phonenumber=request.POST.get('phone')
                member_ch_prof.workplace=request.POST.get('workplace')
                member_ch_prof.position=request.POST.get('position')
                
                
                #####################  RÉGI KÉP TÖRLÉSE ##############
                image_path = member_ch_prof.photo.path
                if os.path.exists(image_path):
                    os.remove(image_path)
                
                
                #####################  UJ KÉP ##############
                image = request.FILES.get('img_data')
                member_ch_prof.photo = image

                member_ch.save()
                member_ch_prof.save()


        if request.method == 'POST' and request.META.get('HTTP_X_REQUESTED_WITH')!="XMLHttpRequest":
            keresett_elem = request.GET.get("keresett_elem")
            adatok = User.objects.order_by("-username").filter(username__contains = keresett_elem) | User.objects.filter(first_name__contains = keresett_elem)
            vissza_adat['elrejt']="btn btn-success w-20 mx-2 visible"
            
        else:
            adatok = User.objects.order_by("-username")
            vissza_adat['elrejt']="btn btn-success w-20 mx-2 invisible"

        vissza_adat['title'] = 'Tagok listája'
        #print(adatok[0].groups)
        vissza_adat['adatok']= adatok
        return render(request, 'user_auth_app/tagok.html', vissza_adat)
    else:
        return render(request, 'user_auth_app/home.html', vissza_adat)



############################# EXCEL IMPORT ######################
def excel_import(request):
    vissza_adat = {}
    adatok = User.objects.all()
    if request.user.is_authenticated:
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()
    vissza_adat['title'] = 'Excel import'
    vissza_adat['adatok']= adatok

    if request.method == 'POST':
        
        upload_succ = True
        person_resource = PersonResource()
        dataset = Dataset()
        new_persons = request.FILES['myfile']

        if not new_persons.name.endswith('xlsx'):
            messages.error(request, 'Nem megfelelő fájl formátum, csak xlsx fájl elfogadott')
            return render(request, 'user_auth_app/lot_reg.html', vissza_adat)


        imported_data = dataset.load(new_persons.read(),format='xlsx')
        # print(imported_data)
        
        for i in range(len(imported_data)):
            data = imported_data[i]
            u = User(username = data[0], last_name = data[1], first_name = data [2], email = data[3], )
            p = Profile(user = u, phonenumber = data[4], workplace = data[5], position = data[6] )
            u.is_active = False

            try:
                u.save()
                p.save()
                my_group = Group.objects.get(name='Tag') 
                my_group.user_set.add(u)
                
                ################# LEVELEK KIKÜLDÉSE AZ ÚJ FELHSZNÁLÓKNAK 
                
                current_site = get_current_site(request)
                email_subject = "MMKSZ jelszó igénylés"
                
                message2 = render_to_string('user_auth_app/emails/new_pass_excel_impo.html',{
                    'name': u.first_name,
                    'domain': current_site.domain,
                    'uid': urlsafe_b64encode(force_bytes(u.pk)),
                    'token': generate_tokens.make_token(u)
                })
                email = EmailMessage(
                    email_subject,
                    message2,
                    settings.DEFAULT_FROM_EMAIL,
                    [u.email]
            
                    )
                try:
                    email.send()
                except:
                    messages.error(request, 'Hiba az email küldés közben közben')
                    return render(request, 'user_auth_app/lot_reg.html', vissza_adat)
                    
            except:
                upload_succ = False
                messages.error(request, 'Hiba a feldolgozás közben')
                return render(request, 'user_auth_app/lot_reg.html', vissza_adat)
            
        if upload_succ:
            messages.info(request, 'Sikeres feltöltés')
    return render(request, 'user_auth_app/lot_reg.html', vissza_adat)


################################### CSOPORTOS EMIL KULDES ################################
def email(request):
    vissza_adat = {}
    tag={}
    addresses = []
   
    if request.user.is_authenticated:
        #print(request.user)
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()


    if request.method == 'POST':
        email_subject = request.POST.get("object")
        message = request.POST.get("e_message")
        csname=request.POST.get("csoport")
        if csname != "Mindenki":
            #csop = User.objects.filter(groups__name=csname)
            #print(csop)
            addr = User.objects.filter(groups__name=csname)
        else:
            addr = User.objects.all()
        for i in range(len(addr)):
            # print(addr[i].email)
            addresses.append(addr[i].email)
            ################################ PROGRESS BAR #############################
        send_mail(email_subject, message, "mmksz@mmksz.hu", addresses )
        return render(request,'user_auth_app/includes/email_elkuldve.html', vissza_adat)
    else:
        csoportok = Group.objects.all()
        vissza_adat['csoportok'] = csoportok
        return render(request, 'user_auth_app/email.html', vissza_adat)




def befizetesek(request):
    vissza_adat = {}
    tag={}
   
    if request.user.is_authenticated:
        #print(request.user)
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()
    return render(request, 'user_auth_app/befizetesek.html', vissza_adat)

def szamlam(request):
    vissza_adat = {}
    tag={}
   
    if request.user.is_authenticated:
        #print(request.user)
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()
    return render(request, 'user_auth_app/szamlam.html', vissza_adat)

def uzenofal(request):
    vissza_adat = {}
    tag={}
   
    if request.user.is_authenticated:
        #print(request.user)
        user_detail = User.objects.filter(id=request.user.id)
        vissza_adat['user_detail'] =user_detail
        vissza_adat['vezeto'] = request.user.groups.filter(name='Vezeto').exists()
    return render(request, 'user_auth_app/uzenofal.html', vissza_adat)


#def memberedit(request):
#    print(request.GET.get("EditMember"))
#    if request.is_ajax and request.method == "GET":
#        print(request.GET.get("EditMember"))