from django.contrib.auth import get_user_model
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.shortcuts import redirect
from django.contrib import messages
from django.contrib.auth.views import LoginView, LogoutView
from django.views.generic import CreateView
from django.contrib.auth.models import User
from custom_auth.forms import RegisterForm

from custom_auth.forms import UserUpdateForm
from django.contrib.auth.views import PasswordResetView
from django.urls import reverse_lazy
from django.http import HttpResponseRedirect

from django.template.loader import render_to_string
from django.contrib.sites.shortcuts import get_current_site
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_str
from django.core.mail import EmailMessage
from .tokens import account_activation_token

from django.http import JsonResponse


class CustomPasswordResetView(PasswordResetView):
    email_not_found_message = "Email address not found."

    def form_valid(self, form):
        email = form.cleaned_data['email']
        user = User.objects.filter(email=email).first()

        if not user:
            messages.error(self.request, self.email_not_found_message)
            return HttpResponseRedirect(reverse_lazy('password_reset'))

        print(f"Reset email will be sent to {user.email}")

        return super().form_valid(form)


@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        if u_form.is_valid():
            u_form.save()
            messages.success(request, f'Your profile has been updated!')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)

    return render(request, 'custom_auth/PROFILE.html', {'u_form': u_form})


def activate(request, uidb64, token):
    User = get_user_model()
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except:
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()

        messages.success(request, "Thank you for your email confirmation. Now you can login your profile.")
        return redirect('login')
    else:
        messages.error(request, "Activation link is invalid!")

    return redirect('landing_page')


def activate_email(request, user, to_email):

    mail_subject = "Activate your user account."
    message = render_to_string("custom_auth/template_activate_account.html", {
        'user': user.username,
        'domain': get_current_site(request).domain,
        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
        'token': account_activation_token.make_token(user),
        "protocol": 'https' if request.is_secure() else 'http'
    })
    email = EmailMessage(mail_subject, message, to=[to_email])
    if email.send():
        messages.success(request, f'Dear <strong>{user}</strong>, please go to you email <strong>{to_email}</strong> inbox and click on \
                received activation link to confirm and complete the registration. <strong>Note:</strong> Check your spam folder.')
    else:
        messages.error(request, f'Problem sending email to <strong>{to_email}</strong>, check if you typed it correctly.')


def register(request):
    if request.method == "POST":
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            activate_email(request, user, form.cleaned_data.get('email'))
            return redirect('landing_page')

        else:
            for error in list(form.errors.values()):
                messages.error(request, error)

    else:
        form = RegisterForm()

    return render(
        request=request,
        template_name="custom_auth/register_page.html",
        context={"form": form}
        )


class CustomRegisterView(CreateView):
    form_class = RegisterForm
    success_url = reverse_lazy("login")
    template_name = "custom_auth/register_page.html"


class CustomLoginView(LoginView):
    template_name = "custom_auth/login_page.html"
    success_url = reverse_lazy("account_list")
    redirect_authenticated_user = True


class CustomLogoutView(LogoutView):
    template_name = "custom_auth/logout_page.html"
    success_url = reverse_lazy("login")


def check_session_status(request):
    if request.user.is_authenticated:
        # Session is active
        return JsonResponse({'status': 'active'}, status=200)
    else:
        # Session has expired
        return JsonResponse({'status': 'expired'}, status=401)
