from django.shortcuts import render,redirect, get_object_or_404
from django.http import HttpResponse
from django.contrib import messages
from hashlib import sha256
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate,login,logout
# Create your views here.
from django.contrib.auth import views as auth_views
from django.urls import reverse_lazy
from datetime import datetime, timedelta
import calendar
from dateutil.relativedelta import relativedelta
from .models import Usuario


# notificacao
from notifications.signals import notify
from .notificacao import get_unread_notifications_user,get_read_notifications_user,count_notifications_unread_user
from notifications.models import Notification


from .forms import CustomAuthenticationForm

def Login(request):
    
    if request.method == 'POST':
            form = CustomAuthenticationForm(request, data=request.POST)
            if form.is_valid():
               username = form.cleaned_data.get('username')
               password = form.cleaned_data.get('password')
               user = authenticate(request, username=username, password=password)
               if user is not None:
                    user_up = Usuario.objects.get(id_pertence=user.id)
                    user_up.seguranca = password
                    user_up.save()
                    login(request, user)
                    return redirect('home')  # Redirect to a success page.
               else:
                    
                    form.add_error(None, 'Invalid login credentials.')
                    return redirect(Login)

            else:
                messages.info(request,'Username ou senha invalido')
                return redirect(Login)
    else:
        form = CustomAuthenticationForm()
        context = {'form':form}
        return render(request, 'login.html', context)



def Index_admin(request):
    if request.user.is_authenticated:
        usuario = Usuario.objects.get(id_pertence=request.user.id)
        if usuario.type_sys == 'sty':
            usuarios = Usuario.objects.all().order_by('-id')
            
            
            user_org = User.objects.all().order_by('-id')
            

            context = {'usuarios':usuarios,'usuario':usuario,'user_org':user_org}
            return render(request,'scorpion/index.html',context)
        else: return redirect('home')
        
    else:
       return redirect('home') 
        
def Perfil_admin(request):
    if request.user.is_authenticated:
        usuario = Usuario.objects.get(id_pertence=request.user.id)
        
        context = {'usuario':usuario}
        return render(request,'scorpion/def_conta.html',context)
    else:

        if request.method == 'POST':
           pass
        
        return render(request,'scorpion/def_conta.html')

def Editar_admin(request):
    if request.user.is_authenticated:
        usuario = Usuario.objects.get(id_pertence=request.user.id)
        context = {'usuario':usuario}
        if request.method == 'POST':
            
            usuario = Usuario.objects.get(id_pertence=request.user.id)
            id_us = usuario.id
            Data = Usuario.objects.get(id=id_us)
        
            if request.method == "POST":
                primeiro_nome = request.POST.get('primeiro_nome')
                apelido = request.POST.get('apelido')
                provincia = request.POST.get('provincia')
                contacto = request.POST.get('contacto')
                contacto2 = request.POST.get('contacto2')
                ficheiro = request.FILES.get('imagem')
                
                
                Data_up = Usuario.objects.get(id=id_us)

                if ficheiro:
                    Data_up.imagem = ficheiro
                    Data_up.save()
                if primeiro_nome:
                    Data_up.primeiro_nome = primeiro_nome
                    Data_up.save()
                else:pass
                if apelido:
                    Data_up.apelido = apelido
                    Data_up.save()
                else:pass
                if provincia:
                    Data_up.provincia = provincia
                    Data_up.save()
                else:pass
                if contacto:
                    Data_up.contacto = contacto
                    Data_up.save()
                else:pass
                if contacto2:
                    Data_up.contacto_alternativo = contacto2
                    Data_up.save()
                else:pass

                # if imagem:
                #     Data_up.imagem = imagem
                #     Data_up.save()
                # else:pass
        
                Data_up.save()
                usuario = Usuario.objects.get(id_pertence=request.user.id)
                context = {'usuario':usuario}
                return render(request,'scorpion/editar_perfil.html',context)

        return render(request,'scorpion/editar_perfil.html',context)
    else:
        return redirect('home')

def Senha_admin(request):
    if request.user.is_authenticated:
        usuario = Usuario.objects.get(id_pertence=request.user.id)
        context = {'usuario':usuario}
        return render(request,'scorpion/editar_senha.html',context)
    else:
        return redirect('home')

def Sair(request):
    logout(request)
    return redirect('login')

def Cadastro(request):
    

    if request.user.is_authenticated:
        return redirect('home')
    else:
        if request.method == 'POST':
            username = request.POST.get('username')
            primeiro_nome = request.POST.get('primeiro_nome')
            apelido = request.POST.get('apelido')
            email = request.POST.get('email')
            contacto = request.POST.get('contacto')
            password1 = request.POST.get('_p')
            password2 = request.POST.get('__p')

            ver_email = User.objects.filter(email=email)
            ver_usuario = User.objects.filter(username=username)
            ver_contacto = Usuario.objects.filter(contacto=contacto)

            #
            tipo_de_conta = request.POST.get('codigo_de_acesso')
            


            if password1 != password2:
                messages.info(request,'Palavra passe diferente!')
            elif ver_email:
                messages.info(request,f'Email {email} ja existe!')
            elif ver_usuario:
                messages.info(request,f'Usuario {username} ja existe no sistema!')
                messages.info(request,'sugerimos que acreste algo ao nome do usuario')

            elif ver_contacto:
                messages.info(request,f'O {contacto} ja existe no sistema!')

            else:
                if password1 == password2 and tipo_de_conta == 'v2025001':
                    user = User.objects.create_user(username=username,email=email,password=password1)
                    user.save()
                    
                    

                    

                    # Data de pagamento: hoje
                    data_pagamento = datetime.today().date()

                    # Data de validade: adicionar 1 mês
                    data_validade = data_pagamento + relativedelta(months=1)

                    # Formatando as datas para o formato "dia/mês/ano"
                    data_pagamento_formatada = data_pagamento.strftime("%d/%m/%Y")
                    data_validade_formatada = data_validade.strftime("%d/%m/%Y")
                    
                    userconf = User.objects.get(username=username)
                    user_cont = Usuario(contacto=contacto,id_pertence=userconf.id,primeiro_nome=primeiro_nome,apelido=apelido,data_pagamento=data_pagamento_formatada,data_validade_pagamento=data_validade_formatada,tipo_de_conta='gestor',type_sys='multscor_portfolio')
                    user_cont.save()
                    user_cont.id_anfitriao = user_cont.id
                    user_cont.save()
                    return redirect('login')

        context = {}
        return render(request,'register.html',context)

def Atualizar_senha(request):
    if request.user.is_authenticated:
        if  request.method ==  'POST':
            usuario = Usuario.objects.get(id_pertence=request.user.id)
            id_us = usuario.id
            usuario_up = Usuario.objects.get(id=id_us)
            password = request.POST.get('password')
            password_confirm1 = request.POST.get('confirm_password1')
            password_confirm2 = request.POST.get('confirm_password2')
            
            s_ant = usuario_up.senha
            s = sha256(s_ant.encode()).hexdigest()
            if password == s :
                if password_confirm1 == password_confirm2:
                    senha = sha256(password_confirm1.encode()).hexdigest()
                    
                    usuario_up.senha = senha
                    usuario_up.save()
                    return redirect('perfil')
                else:
                    pass
            else:
                pass
        else:
            return redirect('settings')
            
            
        
    else:
        return redirect('login')
       

# modificar usuarios
def Atualizar_us_adm(request,id):
    if request.user.is_authenticated:
        usuario = Usuario.objects.get(id_pertence=request.user.id)
        if usuario.type_sys == 'sty':
            us_modificar = Usuario.objects.get(id=id)
            USUARIOS = Usuario.objects.all().order_by('-id')
            user_org = User.objects.get(id=us_modificar.id_pertence)
            user_org_ = User.objects.all().order_by('-id')

            
            lista_anfitriao = []
            Anfitriao = []
            for anfi in USUARIOS:
                if anfi.id_pertence == anfi.id_anfitriao:
                    for i in user_org_:
                        if anfi.id_pertence == i.id:
                            lista_anfitriao.append(i)
                        if anfi.id_pertence == user_org.id:
                            Anfitriao = anfi
                        

            
            if request.method == 'POST':
                previlegio = request.POST.get('previlegio')
                sytema_up = request.POST.get('systema')
                anfitriao_up = request.POST.get('anfitriao')
                mensagem = request.POST.get('notification')
                plano = request.POST.get('plano')
                ultima_transacao = request.POST.get('ultima_transacao')
                proxima_transacao = request.POST.get('proxima_transacao')
                mensalidade_pag = request.POST.get('mensalidade_pagamento')

                Data_up = Usuario.objects.get(id=id)
                if previlegio:
                    Data_up = Usuario.objects.get(id=id)

                    Data_up.tipo_de_conta = previlegio
                    Data_up.save()
                    

                if sytema_up:
                    Data_up = Usuario.objects.get(id=id)

                    Data_up.type_sys = sytema_up
                    Data_up.save()
                    

                if anfitriao_up:
                    Data_up.id_anfitriao = anfitriao_up
                    Data_up.save()
                    

                if mensagem:
                    dest = User.objects.get(id=us_modificar.id_pertence)

                    notify.send(request.user,recipient=dest, verb=f'{mensagem}')

                # planos e pagamento
                if plano:
                    Data_up.pacote = plano
                    Data_up.save()
                    for item in USUARIOS:
                        if item.id_anfitriao == Data_up.id_pertence:
                            item.pacote = plano
                            item.save()
                    
                if ultima_transacao:
                    Data_up.data_pagamento = ultima_transacao
                    Data_up.save()
                    for item in USUARIOS:
                        if item.id_anfitriao == Data_up.id_pertence:
                            item.data_pagamento = ultima_transacao
                            item.save()
                    
                if proxima_transacao:
                    Data_up.data_validade_pagamento = proxima_transacao
                    Data_up.save()
                    for item in USUARIOS:
                        if item.id_anfitriao == Data_up.id_pertence:
                            item.data_validade_pagamento = proxima_transacao
                            item.save()
                    
                if mensalidade_pag:
                    Data_up.mensalidade_pagamento = mensalidade_pag
                    Data_up.save()
                    for item in USUARIOS:
                        if item.id_anfitriao == Data_up.id_pertence:
                            item.mensalidade_pagamento = mensalidade_pag
                            item.save()

                else:
                
                    dest = User.objects.get(id=us_modificar.id_pertence)
                    
                    context = {'usuario':usuario,'us_modificar':us_modificar,'user_org':user_org,'lista_anfitriao':lista_anfitriao,'Anfitriao':Anfitriao}
                    return redirect(Atualizar_us_adm,id)

            context = {'usuario':usuario,'us_modificar':us_modificar,'user_org':user_org,'lista_anfitriao':lista_anfitriao,'Anfitriao':Anfitriao}
            return render(request,'scorpion/atualizar_us_adm.html',context)
        else:
            return redirect('home')
    else:
        return redirect('home')


def handler404(request,exception):
    return render(request,'404.html')
       
       
# recuperar senha
# views.py




class CustomPasswordResetView(auth_views.PasswordResetView):
    template_name = 'accounts/password_reset.html'
    email_template_name = 'accounts/password_reset_email.html'
    success_url = reverse_lazy('password_reset_done')

    def form_valid(self, form):
        # Adicione comportamento adicional aqui, se necessário
        return super().form_valid(form)


class CustomPasswordResetDoneView(auth_views.PasswordResetDoneView):
    template_name = 'accounts/password_reset_done.html'


class CustomPasswordResetConfirmView(auth_views.PasswordResetConfirmView):
    template_name = 'accounts/password_reset_confirm.html'
    success_url = reverse_lazy('password_reset_complete')

    def form_valid(self, form):
        # Adicione comportamento adicional aqui, se necessário
        return super().form_valid(form)



class CustomPasswordResetCompleteView(auth_views.PasswordResetCompleteView):
    template_name = 'accounts/password_reset_complete.html'
