from xml.sax import handler
from django.shortcuts import render
from machine_shop import settings
from panel_api import urls
from panel_api.models import EndUser, TermsAndConditions
from django.shortcuts import render, redirect,HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from django.contrib.auth.hashers import make_password ,check_password
from rest_framework_simplejwt.tokens import RefreshToken
import xml.sax.handler
import random
from django.template.loader import render_to_string
from django.core import mail
# Create your views here.

class UserRegister(APIView):
    def post(self,request):
        try:
            data = request.data
            name = data.get('name')
            email = data.get('email').strip().replace(" ", "").lower()
            password = data.get('password')
            if not email:
                return Response({"message":'email is required'},status=status.HTTP_400_BAD_REQUEST)
            if not name:
                return Response({"message":'name is required'},status=status.HTTP_400_BAD_REQUEST)
            if not password:
                return Response({"message":'password is required'},status=status.HTTP_400_BAD_REQUEST)

            new_password = make_password(password)
            check_email = EndUser.objects.filter(email=email).first()
            if check_email:
                return Response({"message":"The email is already registered"},status=status.HTTP_409_CONFLICT)
            else:
                user_obj = EndUser.objects.create(name=name,email=email,password=new_password)
            return Response({"message":'You have been successfully registered with us.'})
        except Exception as e:
            return Response({"message":str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR) 
    
 
class LoginUser(APIView):
    def post(self,request):
        email = request.data.get('email')
        password = request.data.get('password')

        if not email:
            return Response({"message":'email is required'},status=status.HTTP_400_BAD_REQUEST)
        if not password:
            return Response({"message":'password is required'},status=status.HTTP_400_BAD_REQUEST)
        try:
            user = EndUser.objects.get(email=email)
        except EndUser.DoesNotExist:
            return Response({"message": "User Not credentials"}, status=status.HTTP_401_UNAUTHORIZED)

        if not check_password(password, user.password):
            return Response({"message": "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED)
        refresh = RefreshToken.for_user(user)

        return Response({
            "message": "Login successful",
            "username":user.name,
            "access": str(refresh.access_token),
            "refresh": str(refresh)
        }, status=status.HTTP_200_OK)


class UserForgetpassword(APIView):
    def post(self,request):
        try:
            data = request.data
            email =data.get('email').strip().lower()
            if not email:
                return Response({"message":'Email is required'})
            user = EndUser.objects.filter(email= email).count()
            if user == 0:
                return Response({"message":'This email does not exist in our database, please enter the valid email address.'},status=status.HTTP_404_NOT_FOUND)
            user_obj = EndUser.objects.filter(email= email).first()
            if user_obj:
                theotp = random.randrange(1000,9999,5)
                user_obj.forgot_password_otp = theotp
                user_obj.save()
                print('--------------',user_obj,"theotp")
                to_email= user_obj.email
                subject = 'Forget Password OTP'
                html_message = render_to_string('forget_password_otp.html',{'otp':theotp})
                plane_message = html_message
                from_email = settings.EMAIL_HOST_USER
                mail.send_mail(subject,plane_message,from_email,[to_email],html_message= html_message)
                return Response({ "message": "Rendered HTML",
                        "html": html_message})
            else:
                return Response({"message":'Email not exists'})
        except Exception as e:
                print(e)
                return Response({"message":str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class verifyForgetPasswordOTP(APIView):
    def post(self,request):
        try:
            email= request.data.get('email').strip().lower()
            if not email:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email is required'},status=status.HTTP_400_BAD_REQUEST)
            otp = request.data.get('otp')
            if not otp:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'otp is Required'},status =status.HTTP_400_BAD_REQUEST)
            email_check= EndUser.objects.filter(email = email).exists()
            if not email_check:
                return Response ({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Email not exist'},status=status.HTTP_400_BAD_REQUEST)
            user_obj = EndUser.objects.filter(email = email,forgot_password_otp = otp).first()
            if user_obj:
                return Response({'status_code':status.HTTP_200_OK,'status_message':'Successfully Verified'})
            else:
                return Response({'status_code':status.HTTP_400_BAD_REQUEST,'status_message':'Invalid otp'})
        except Exception as e:
                return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class TermsCondition(APIView):
    def get(self,request):
        terms = TermsAndConditions.objects.order_by('-updated_at').first()
        if not terms:
            return Response({"detail": "No terms found."}, status=status.HTTP_404_NOT_FOUND)

        data = {
            "id": terms.id,
            "title": terms.title,
            "content": terms.content
        }
        return Response(data, status=status.HTTP_200_OK)


class UserProfile(APIView):

    def get(self, request):
        email = request.data.get('email')

        # if not email:
        #     return Response({"message": "Email is required"}, status=status.HTTP_400_BAD_REQUEST)

        try:
            user = EndUser.objects.get(email=email)
            return Response({
                "message": "Profile fetched successfully",
                "name": user.name,
                "email": user.email,
                "phone_number": user.phone_number,
                "image": request.build_absolute_uri(user.image.url) if user.image else None,
                "is_profile_completed": user.is_profile_completed,
                "created_at": user.created_at,
                "updated_at": user.updated_at
            }, status=status.HTTP_200_OK)
        except EndUser.DoesNotExist:
            return Response({"message": "User not found"}, status=status.HTTP_404_NOT_FOUND)

    def post(self, request):

        email = request.data.get('email')
        name = request.data.get('name')
        phone = request.data.get('phone_number')
        image = request.FILES.get('image')

        # if not email:
        #     return Response({"message": "Email is required"}, status=status.HTTP_400_BAD_REQUEST)

        try:
            user = EndUser.objects.get(email=email)
            if name:
                user.name = name
            if phone:
                user.phone_number = phone
            if image:
                user.image = image

            user.is_profile_completed = True
            user.save()

            return Response({
                "message": "Profile updated successfully",
                "name": user.name,
                "email": user.email,
                "phone_number": user.phone_number,
                "image": request.build_absolute_uri(user.image.url) if user.image else None
            }, status=status.HTTP_200_OK)
        except EndUser.DoesNotExist:
            return Response({"message": "User not found"}, status=status.HTTP_404_NOT_FOUND)
