from django.contrib.auth import get_user_model
from django.db import IntegrityError
from django.http import HttpResponse
from django.shortcuts import render, redirect
from manage_user import *
from django.contrib.auth import authenticate, login, logout
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.db import connection, reset_queries
from manage_user.models import *
from Trendcatch import settings
from django.core.mail import send_mail, EmailMessage
from django.template.loader import render_to_string
from django.contrib.sites.shortcuts import get_current_site
# from .token import TokenG
from django.contrib import messages
from random import choice
from django.contrib.auth import get_user_model
import string
# Create your views here.
def Generate():
    a = string.ascii_lowercase
    confi = ''
    for i in range(15):
        confi += choice(a)
        confi += choice(string.digits)
        
    return confi

def Home(request):
    if request.user.is_authenticated:
        Connected = True
    else:
        Connected = False
    context = {
        "connected": Connected,
        'message':messages.get_messages(request),    
    
    }
    return render(request,'index.html',context)


def Register(request):
    date_now = datetime.now()
    confi=''
    if request.method == 'POST':
        username = request.POST.get('username')
        email = request.POST.get('email')
        password = request.POST.get('password')
        confipassword = request.POST.get('confipassword')
        Account_type = request.POST.get('Account_type')
        print(f"{email} et {username} \n Information Entrer \n {date_now}")
        min_pass = 8

        if User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists():
            messages.add_message(request, messages.ERROR, 'Username ou email existe déjà sur notre site')
            return render(request, 'login.html', {'message': messages.get_messages(request)})
        elif len(password) < min_pass:
            messages.add_message(request, messages.ERROR, 'Mot de Passe Trop courte')            

        elif password != confipassword:
            messages.add_message(request, messages.ERROR, 'confirmation de Mot de Passe Incorrect')
            print(f'confiirmation de Mot de Passe Incorrect \n Utilisateur Non Authentifier Non Connecter \n {date_now} ')

        elif len(username) < 5:
            messages.add_message(request, messages.ERROR, 'Username Trop court')

        else:
            try:
                create = User.objects.create_user(username=username, email=email, password=password)
                create.is_active = False
                create.save()

                # Création du profil en fonction du type de compte
                if Account_type == 'Agent':
                    confi=Generate()
                    Profile_Agent.objects.create(user=create, first_name=username, email=email, confi=confi)
                    
                elif Account_type == 'Broker':
                    confi=Generate()
                    Profile_Broker.objects.create(user=create, first_name=username, email=email, confi=confi)
                    # messages.add_message(request, messages.SUCCESS, f' Activate your account from your email \n {email}')
                else:
                    confi=Generate()
                    Profile.objects.create(user=create, first_name=username, email=email,confi=confi)
                    Profile_Mail_List.objects.create(customer_email=email)
                    # messages.add_message(request, messages.SUCCESS, f' Activate your account from your email \n {email}')
                
                
                
                messages.add_message(request, messages.SUCCESS, f' Activate your account from your email\n \t\t{email}')
                # Envoi de l'email de bienvenue
                subject = 'Welcome to TrendsCatch'
                message = f'Welcome to you {username},\n now your promote is safe to add the prospect'
                from_email = settings.EMAIL_HOST_USER
                to_list = [email]
                send_mail(subject, message, from_email, to_list, fail_silently=True)

                # notification pour devellopeur
                subject = 'Nouveau Utilisateur Incrit sur TrendsCatch'
                to_list = ['laurorenicodem@gmail.com']
                message=f' un Utilisateur est inscrit sur TrendCatch\n\n Username: {username}\n Email: {email}\n'
                send_mail(subject, message, from_email,to_list, fail_silently=True)

                # Envoi de l'email de confiirmation
                current_site = get_current_site(request)
                email_subject = f'confirmer votre email {email} sur TrendCatch'
                message_confirm = render_to_string("email/emailconfirm.html", {
                    'name': username,
                    'domain': current_site.domain,
                    'confi': confi,
                })

                send_mail(email_subject, message_confirm, from_email, [email], fail_silently=False)
                
                return redirect(Home)

            except IntegrityError:
                print('username Existe deja')
                messages.add_message(request, messages.ERROR, 'Username ou email existe deja sur notre site')

    context = {
        'message': messages.get_messages(request),    
    }
    return render(request, 'login.html', context)


def Login(request):
    date_now = datetime.now()

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('Password')

        try:
            # Tentative d'authentification avec l'email
            user = User.objects.get(email=username)
        except User.DoesNotExist:
            # Si l'email n'existe pas, essaie de se connecter avec le nom d'utilisateur
            user = None
            messages.success(request, "l'email n'existe pas, essaie de se connecter avec le nom d'utilisateur")



        if user is not None:
            user = authenticate(username=user.username, password=password)
        else:
            # Si l'email n'existe pas, essaie de se connecter avec le nom d'utilisateur
            user = authenticate(username=username, password=password)
            # messages.success(request, "l'email n'existe pas, essaie de se connecter avec le nom d'utilisateur")

        if user is not None:
            if user.is_active:
                login(request, user)
                print(f"Information Correct \n Utilisateur {username} est Authentifier et Connecter \n {date_now}")
                messages.success(request, 'Vous êtes connecté')
                return redirect('home')  
            else:
                messages.error(request, 'Compte non encore vérifié')
                print('Compte non encore vérifié')
        else:
            messages.error(request, "Erreur pour Authentifier")

    context = {
        'message': messages.get_messages(request),
    }
    return render(request, 'login.html', context)

def Dashboard(request):
    context = {
        # 'a':Projet.objects.filter(publik=True).order_by('-dat_kreye')[0:4],
        'prospect':Prospect.objects.select_related('customer_email').all(),
        'customer_email':Profile_Mail_List.objects.all(),

    }
    return render(request,'dashboard.html',context)

def Logout(request):
    logout(request)
    messages.add_message(request,messages.INFO,'vous etes deconnecter')
    return redirect(Home)


def Add_Prospect(request):
    Connected = request.user.is_authenticated

    if request.method == 'POST':
        gender = request.POST.get('gender')
        first_name_agent = request.POST.get('first_name_agent')
        last_name_agent = request.POST.get('last_name_agent')
        first_name_prospect = request.POST.get('first_name_prospect')
        last_name_prospect = request.POST.get('last_name_prospect')
        email_prospect = request.POST.get('email_prospect')
        phone_number_prospect = request.POST.get('phone_number_prospect')
        location = request.POST.get('location')
        reviews_agent = request.POST.get('reviews_agent')
        customer_notes = request.POST.get('customer_notes')
        customer_email = request.POST.get('customer_email')
        # automated_targeting = request.POST.get('automated_targeting')
        language = request.POST.get('language')
        print(f"{first_name_agent},{last_name_prospect},{first_name_prospect}, {last_name_agent}")
        
        # Assurez-vous que customer_email est une instance de Profile
        profile_instance, created = Profile.objects.get_or_create(email=customer_email)
        
        # Créez un Prospect en utilisant l'instance de Profile
        Prospect.objects.create(
            gender=gender, first_name_agent=first_name_agent, last_name_agent=last_name_agent,
            first_name_prospect=first_name_prospect, last_name_prospect=last_name_prospect,
            phone_number_prospect=phone_number_prospect, email_prospect=email_prospect,
            location=location, reviews_agent=reviews_agent, customer_notes=customer_notes,
            customer_email=profile_instance,  # Utilisez l'instance de Profile
            language=language,
        )
        
        return redirect(Dashboard)  

    context = {
        "connected": Connected,
    }

    return render(request, 'dashboard.html', context)


def activate(request, confi):
    try:
        # Vérifier si le confi existe dans le profil
        profile = Profile.objects.get(confi=confi)
        activate_user_by_email(profile.user.email)
        messages.add_message(request, messages.SUCCESS, 'Account Activated')
    except Profile.DoesNotExist:
        try:
            # Vérifier si le confi existe dans le profil agent
            agent_profile = Profile_Agent.objects.get(confi=confi)
            activate_user_by_email(agent_profile.user.email)
            messages.add_message(request, messages.SUCCESS, 'Account Activated')
        except Profile_Agent.DoesNotExist:
            try:
                # Vérifier si le confi existe dans le profil broker
                broker_profile = Profile_Broker.objects.get(confi=confi)
                activate_user_by_email(broker_profile.user.email)
                messages.add_message(request, messages.SUCCESS, 'Account Activated')
            except Profile_Broker.DoesNotExist:
                messages.add_message(request, messages.ERROR, 'Bad Link')
    
    return redirect(Login)


def activate_user_by_email(email):
    # Récupérer l'utilisateur associé à cet email
    user = get_user_model().objects.get(email=email)
    # Activer l'utilisateur
    user.is_active = True
    user.save()
