from passlib.hash import django_pbkdf2_sha256 as handler
from django.shortcuts import render
from machine_shop import settings
from panel_api import urls
from panel_api.models import EndUser
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 random
from django.template.loader import render_to_string
from django.core import mail
from rest_framework.authentication import get_authorization_header
from rest_framework_simplejwt.backends import TokenBackend
from .authentication import authenticated
from .models import *
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import Q
from django.utils.timesince import timesince
from admin_panel.models import *

# from google.oauth2.service_account import Credentials
# from googleapiclient.discovery import build

# from google.oauth2.service_account import Credentials
# from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/drive']

# 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({"status_message":'email is required'},status=status.HTTP_400_BAD_REQUEST)
			if not name:
				return Response({"status_message":'name is required'},status=status.HTTP_400_BAD_REQUEST)
			if not password:
				return Response({"status_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({"status_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({"status_message":'You have been successfully registered with us.'})
		except Exception as e:
			return Response({"status_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({"status_message":'email is required'},status=status.HTTP_400_BAD_REQUEST)
		if not password:
			return Response({"status_message":'password is required'},status=status.HTTP_400_BAD_REQUEST)
		
		try:
			user = EndUser.objects.get(email=email)
		except EndUser.DoesNotExist:
			return Response({"status_message": "User Not credentials"}, status=status.HTTP_401_UNAUTHORIZED)

		if not check_password(password, user.password):
			return Response({"status_message": "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED)
		
		refresh = RefreshToken.for_user(user)
		all_data = {
			"email":user.email,
			"is_password_changed":user.password_changed,
			"access": str(refresh.access_token),
			"refresh": str(refresh),
			"type":"user"
		}
		return Response({
			'status_code': status.HTTP_200_OK,
			"status_message": "Login successful",
			"data":all_data,
		}, 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({"status_message":'Email is required'})
			user = EndUser.objects.filter(email= email).count()
			if user == 0:
				return Response({"status_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({ "status_message": "Rendered HTML",
						"html": html_message})
			else:
				return Response({"status_message":'Email not exists'})
		except Exception as e:
				print(e)
				return Response({"status_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 changeForgetPassword(APIView):
	def post(self,request):
		try:
			email = request.data.get('email').strip().lower()
			if not email:
				return Response({'status_message': 'email is required'}, status=status.HTTP_404_NOT_FOUND)
			user_obj = EndUser.objects.filter(email=email).first()
			if not user_obj:
				return Response({'status_message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)
			new_password = request.data.get('new_password')
			if not new_password:
				return Response({'status_message':'new password is required'},status=status.HTTP_400_BAD_REQUEST)
			confirm_password = request.data.get('confirm_password')
			if not confirm_password:
				return Response({'status_message':'confirm password is required'},status=status.HTTP_400_BAD_REQUEST)
			if new_password != confirm_password:
				return Response({'status_message':'Password and confirm password are not same.'},status=status.HTTP_403_FORBIDDEN)
			encrypt_password = handler.hash(confirm_password)
			user_obj.password = encrypt_password
			user_obj.save()
			return Response({'status_message':'Success'}) 
		except Exception as e:
			return Response({'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)
		  


		

class UserProfile(APIView):
	def get(self, request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)
			user = EndUser.objects.get(email=user_obj.email)
			data = {
				"name": user.name,
				"email": user.email,
				"phone_number": user.phone_number,
				"image":user.image,
				"is_profile_completed": user.is_profile_completed,
				"created_at": user.created_at,
				"updated_at": user.updated_at
			}
			return Response({
				'status_code':status.HTTP_200_OK,
				"status_message": "Profile fetched successfully",
				'data':data,
			}, status=status.HTTP_200_OK)
		except EndUser.DoesNotExist:
			return Response({"status_message": "User not found"}, status=status.HTTP_404_NOT_FOUND)

	def post(self, request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message':str(e)},status=status.HTTP_401_UNAUTHORIZED)
			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)
				
			user = EndUser.objects.get(email=user_obj.email)


			name = request.data.get('name')
			if not name:
				return Response({'status_message': 'name is required'}, status=status.HTTP_400_BAD_REQUEST)
			
			phone = request.data.get('phone_number')
			if not phone:
				return Response({'status_message': 'phone is required'}, status=status.HTTP_400_BAD_REQUEST)
			
			image = request.data.get('image')
			if not image:
				return Response({'status_message': 'image is required'}, status=status.HTTP_400_BAD_REQUEST)
			
			print("MEDIA_ROOT:", settings.MEDIA_ROOT)
			media_root=settings.MEDIA_ROOT

			user.name = name
			user.phone_number = phone
			user.image = image
			user.is_profile_completed = True
			user.save()

			data = {
				"name": user.name,
				"email": user.email,
				"phone_number": user.phone_number,
				"image":user.image,
				"is_profile_completed": user.is_profile_completed,
				"created_at": user.created_at,
				"updated_at": user.updated_at
			}
			return Response({
				'status_code': status.HTTP_200_OK,
				"status_message": "Profile updated successfully",
				'data':data,
			}, status=status.HTTP_200_OK)
		

		except EndUser.DoesNotExist:
			return Response({"status_message": "User not found"}, status=status.HTTP_404_NOT_FOUND)
		

	
class ResetPassword(APIView):
	def post(self,request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_message': 'user not found'}, status=status.HTTP_404_NOT_FOUND)

			old_password = request.data.get('old_password')
			if not old_password:
				return Response({'status_message':'old password is required'},status=status.HTTP_400_BAD_REQUEST)
			   
			new_password = request.data.get('new_password')
			if not new_password:
				return Response({'status_message':'new password is required'},status=status.HTTP_400_BAD_REQUEST)
			   
			check_password = user_obj.password
			check = handler.verify(old_password,check_password)
			if check == False:
				return Response({'status_message':'Old password is incorrect'},status=status.HTTP_403_FORBIDDEN)
			password = new_password
			encrypt_password = handler.hash(password)
			user_obj.password = encrypt_password
			user_obj.password_changed = True
			user_obj.save()
			return Response({'status_code': status.HTTP_200_OK,'status_message':'Success'},status=status.HTTP_200_OK) 
		except Exception as e:
			return Response({'status_message':str(e)},status=status.HTTP_500_INTERNAL_SERVER_ERROR)

def get_drive_service():
	creds = Credentials.from_service_account_file(f"/var/www/html/tms-backend/machineshop-477507-6a7362cb7e7f.json", scopes=SCOPES)
	
	service = build('drive', 'v3', credentials=creds)
	return service


def create_project_folder(service, project, share_email=None):
    """
    Create a main project folder with subfolders in Google Drive.
    Optionally share the main folder with a given email.
    """
    from datetime import datetime

    date_str = datetime.now().strftime('%Y%m%d')
    folder_name = f"[TEMPLATE] {date_str}_{project.client_name}_{project.project_title}_{project.project_type}"
    print(folder_name, ' -------------->>> folder_name')

    folder_metadata = {
        'name': folder_name,
        'mimeType': 'application/vnd.google-apps.folder'
    }

    main_folder = service.files().create(body=folder_metadata, fields='id').execute()
    main_folder_id = main_folder.get('id')
    print(main_folder_id, "========main_folder_id=======")

    if share_email:
        service.permissions().create(
            fileId=main_folder_id,
            body={
                'type': 'user',
                'role': 'writer',  
                'emailAddress': share_email
            },
            fields='id'
        ).execute()

    subfolders = ['Deliverables', 'Notes', 'Specs', 'Milestones']
    for sub in subfolders:
        subfolder_metadata = {
            'name': sub,
            'mimeType': 'application/vnd.google-apps.folder',
            'parents': [main_folder_id]
        }
        subfolder = service.files().create(body=subfolder_metadata, fields='id').execute()

       
        if share_email:
            service.permissions().create(
                fileId=subfolder.get('id'),
                body={
                    'type': 'user',
                    'role': 'writer',
                    'emailAddress': share_email
                },
                fields='id'
            ).execute()

    return main_folder_id


class AddProjectModules(APIView):
	def post(self, request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

			required_fields = [
				'deliverabes_list', 'format_specs', 'resolution_aspect_ratio',
				'notes_spec_req', 'initial_bid_budget', 'deposite_percentage',
				'deposite_value', 'payment_structure', 'producer',
				'executive_producer_supervisor', 'start_date', 'end_date',
				'key_milestones', 'project_title', 'client_name',
				'project_type', 'client_initials'
			]

			missing_fields = [field for field in required_fields if not request.data.get(field)]
			if missing_fields:
				return Response(
					{'status_message': f'Missing required fields: {", ".join(missing_fields)}'},
					status=status.HTTP_400_BAD_REQUEST
				)

			project_data = ProjectModule.objects.create(
				user=user_obj,
				deliverabes_list=request.data.get('deliverabes_list'),
				format_specs=request.data.get('format_specs'),
				resolution_aspect_ratio=request.data.get('resolution_aspect_ratio'),
				notes_spec_req=request.data.get('notes_spec_req'),
				initial_bid_budget=request.data.get('initial_bid_budget'),
				deposite_percentage=request.data.get('deposite_percentage'),
				deposite_value=request.data.get('deposite_value'),
				payment_structure=request.data.get('payment_structure'),
				producer=request.data.get('producer'),
				executive_producer_supervisor=request.data.get('executive_producer_supervisor'),
				start_date=request.data.get('start_date'),
				end_date=request.data.get('end_date'),
				key_milestones=request.data.get('key_milestones'),
				project_title=request.data.get('project_title'),
				client_name=request.data.get('client_name'),
				project_type=request.data.get('project_type'),
				client_initials=request.data.get('client_initials')
			)

			service = get_drive_service()
			folder_id = create_project_folder(service, project_data, share_email="machinedeveloper6@gmail.com")
			print(folder_id)


			# Store folder_id in project
			project_data.google_drive_folder_id = folder_id
			
			project_data.save()

			return Response({
				'status_code': status.HTTP_200_OK,
				'status_message': 'Project module created successfully',
				'google_drive_folder_id': folder_id
			}, status=status.HTTP_201_CREATED)
		except Exception as e:
			print("Error:", e)
			return Response({'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


	def get(self, request, pk=None):
		"""Get single project detail or paginated list of all projects"""
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)


			if pk:
				# Single project detail view
				project = ProjectModule.objects.filter(id=pk,user =user_obj.id).first()
				if not project:
					return Response({'status_message': 'Project not found'}, status=status.HTTP_404_NOT_FOUND)

				project_data = {
					'id': project.id,
					'project_title': project.project_title,
					'client_name': project.client_name,
					'client_initials': project.client_initials,
					'project_type': project.project_type,
					'deliverabes_list': project.deliverabes_list,
					'format_specs': project.format_specs,
					'resolution_aspect_ratio': project.resolution_aspect_ratio,
					'notes_spec_req': project.notes_spec_req,
					'initial_bid_budget': project.initial_bid_budget,
					'deposite_percentage': project.deposite_percentage,
					'deposite_value': project.deposite_value,
					'payment_structure': project.payment_structure,
					'producer': project.producer,
					'executive_producer_supervisor': project.executive_producer_supervisor,
					'start_date': project.start_date,
					'end_date': project.end_date,
					'key_milestones': project.key_milestones,
					'is_archived':project.is_archived,
					'project_status': project.project_status if project.project_status else None,
					'created_at': project.created_at if hasattr(project, 'created_at') else None,
				}
				return Response({'status_code': status.HTTP_200_OK,'status_message': 'Fetched Successfully','data': project_data}, status=status.HTTP_200_OK)

			projects = ProjectModule.objects.filter(user=user_obj.id).order_by('-id')

			# Get and sanitize pagination parameters
			page_number = request.GET.get('page', 1)
			page_size = request.GET.get('page_size', 10)

			try:
				page_size = int(page_size)
				if page_size < 1:
					page_size = 10
				if page_size > 100:  # optional: cap max page size
					page_size = 100
			except (ValueError, TypeError):
				page_size = 10

			paginator = Paginator(projects, page_size)

			try:
				page_obj = paginator.get_page(page_number)
			except (EmptyPage, PageNotAnInteger):
				page_obj = paginator.get_page(1)

			project_list = [
				{
					'id': project.id,
					'project_title': project.project_title,
					'client_name': project.client_name,
					'client_initials': project.client_initials,
					'project_type': project.project_type,
					'deliverables_list': project.deliverabes_list,  # Fixed typo
					'format_specs': project.format_specs,
					'resolution_aspect_ratio': project.resolution_aspect_ratio,
					'notes_spec_req': project.notes_spec_req,
					'initial_bid_budget': project.initial_bid_budget,
					'deposit_percentage': project.deposite_percentage,   # Also consider typo: "deposite" → "deposit"
					'deposit_value': project.deposite_value,
					'payment_structure': project.payment_structure,
					'producer': project.producer,
					'executive_producer_supervisor': project.executive_producer_supervisor,
					'start_date': project.start_date,
					'end_date': project.end_date,
					'key_milestones': project.key_milestones,
					'is_archived':project.is_archived,
					'project_status': project.project_status if project.project_status else None,
					'created_at': project.created_at,  # Safe to include directly
				}
				for project in page_obj.object_list
			]

			return Response({
				'total_projects': paginator.count,
				'total_pages': paginator.num_pages,
				'current_page': page_obj.number,
				'page_size': page_size,
				'projects': project_list
			}, status=status.HTTP_200_OK)

		except Exception as e:
			print("Error:", e)
			return Response({'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



	def put(self, request, pk):
		"""Update an existing project module"""
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_code': status.HTTP_401_UNAUTHORIZED,'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_code': status.HTTP_404_NOT_FOUND,'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

			project = ProjectModule.objects.filter(id=pk).first()
			if not project:
				return Response({'status_message': 'Project not found'}, status=status.HTTP_404_NOT_FOUND)

			updatable_fields = [
				'deliverabes_list', 'format_specs', 'resolution_aspect_ratio',
				'notes_spec_req', 'initial_bid_budget', 'deposite_percentage',
				'deposite_value', 'payment_structure', 'producer',
				'executive_producer_supervisor', 'start_date', 'end_date',
				'key_milestones', 'project_title', 'client_name',
				'project_type', 'client_initials'
			]

			for field in updatable_fields:
				if field in request.data:
					setattr(project, field, request.data.get(field))

			project.save()
			return Response({'status_code': status.HTTP_200_OK,'status_message': 'Project module updated successfully'}, status=status.HTTP_200_OK)

		except Exception as e:
			print("Error:", e)
			return Response({'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


	def delete(self, request, pk):
		"""Delete a project module"""
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)

			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_code':status.HTTP_404_NOT_FOUND,'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

			project = ProjectModule.objects.filter(id=pk).first()
			if not project:
				return Response({'status_code':status.HTTP_404_NOT_FOUND,'status_message': 'Project not found'}, status=status.HTTP_404_NOT_FOUND)

			project.delete()
			return Response({'status_code': status.HTTP_200_OK,'status_message': 'Project module deleted successfully'}, status=status.HTTP_200_OK)

		except Exception as e:
			print("Error:", e)
			return Response({'status_code':status.HTTP_500_INTERNAL_SERVER_ERROR,'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class getUserNotifications(APIView):
	def get(self, request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_code':status.HTTP_401_UNAUTHORIZED,'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			
			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_code':status.HTTP_404_NOT_FOUND,'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)
			admin_obj  =  SuperAdmin.objects.all().first()
			if user_obj.status ==  False:
				return Response({'status_code':status.HTTP_406_NOT_ACCEPTABLE,"status_message":'Your account has been Inactive, Please contact to admin.',"email":admin_obj.email},status=status.HTTP_406_NOT_ACCEPTABLE)
			notify_obj = EndUserNotifications.objects.filter(user_id =user_obj.id )
			all_Data = []
			for notify in notify_obj:
				all_data = {
					'id':notify.id,
					'message':notify.message,
					'is_read':notify.is_read,
					'type':notify.type,
					'start_date':timesince(notify.start_date)+' ago',
				}
				all_Data.append(all_data)

			return Response({'status_code':status.HTTP_200_OK,'status_message':'Fetched Successfully','data':all_Data})
		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 deleteUserNotifications(APIView):
	def post(self, request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			
			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({'status_code':status.HTTP_404_NOT_FOUND,'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)
			admin_obj  =  SuperAdmin.objects.all().first()
			if user_obj.status ==  False:
				return Response({'status_code':status.HTTP_406_NOT_ACCEPTABLE,"status_message":'Your account has been Inactive, Please contact to admin.',"email":admin_obj.email},status=status.HTTP_406_NOT_ACCEPTABLE)
			notification_id = request.data.get('notification_id')
			if not notification_id:
				return Response({'status_code':status.HTTP_404_NOT_FOUND,'status_message': 'notification_id id required'}, status=status.HTTP_404_NOT_FOUND)

			not_obj =  EndUserNotifications.objects.filter(id = notification_id).first()
			not_obj.delete()
			return Response({'status_code':status.HTTP_200_OK,'status_message':'Deleted Successfully'},status=status.HTTP_200_OK)
		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 ArchiveProjectUser(APIView):
	def post(self, request):
		try:
			try:
				uid = authenticated(request)
			except Exception as e:
				return Response({'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
			
			user_obj = EndUser.objects.filter(id=uid).first()
			if not user_obj:
				return Response({"status_code": status.HTTP_404_NOT_FOUND,'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)
			admin_obj  =  SuperAdmin.objects.all().first()
			if user_obj.status ==  False:
				return Response({"status_code": status.HTTP_406_NOT_ACCEPTABLE,"status_message":'Your account has been Inactive, Please contact to admin.',"email":admin_obj.email},status=status.HTTP_406_NOT_ACCEPTABLE)
			project_id = request.data.get("project_id")
			try:
				project = ProjectModule.objects.get(id=project_id)
				project.is_archived = True
				project.save()
				return Response({"status_code": status.HTTP_200_OK, "status_message": "Project archived successfully"},status=status.HTTP_200_OK)
			except ProjectModule.DoesNotExist:
				return Response({"status_code": status.HTTP_404_NOT_FOUND, "status_message": "Project not found"},status=status.HTTP_404_NOT_FOUND)
			
		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 UpdateUserprojectStatus(APIView):
    def post(self, request, project_id=None):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response({'status_message': str(e)}, status=status.HTTP_401_UNAUTHORIZED)
            
            user_obj = EndUser.objects.filter(id=uid).first()
            if not user_obj:
                return Response({'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)
            
            if not project_id:
                return Response({'status_message': 'project_id is required'}, status=status.HTTP_400_BAD_REQUEST)
            
            project = ProjectModule.objects.filter(id=project_id).first()
            if not project:
                return Response({'status_message': 'Project not found'}, status=status.HTTP_404_NOT_FOUND)


            new_status = request.data.get('project_status')
            if not new_status:
                return Response({'status_message': 'project_status is required'}, status=status.HTTP_400_BAD_REQUEST)

            user_obj.project_status = new_status
            user_obj.save()

            return Response({
                'status_code': status.HTTP_200_OK,
                'status_message': f"User status updated to '{new_status}'",
                'user_id': user_obj.id,
                'project_id': project.id,
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response({'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class Userdashboard(APIView):
    def get(self, request):
        try:
            try:
                uid = authenticated(request)
            except Exception as e:
                return Response(
                    {"status_message": f"Authentication failed: {str(e)}"},
                    status=status.HTTP_401_UNAUTHORIZED
                )

            user_obj = EndUser.objects.filter(id=uid).first()
            if not user_obj:
                return Response({'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

            assignments = ProjectAssignment.objects.filter(user=user_obj)

            status_counts = {
                "Pending": assignments.filter(status="Pending").count(),
                "Inquiry": assignments.filter(status="Inquiry").count(),
                "Bid": assignments.filter(status="Bid").count(),
                "Approved": assignments.filter(status="Approved").count(),
                "Delivered": assignments.filter(status="Delivered").count(),
                "Archived": assignments.filter(status="Archived").count(),
            }

            return Response({
                'status_message': 'success',
                'data': status_counts
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response({'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class AssignProject(APIView):
    def post(self, request):
        try:
            try:
                uid = authenticated(request) 
            except Exception as e:
                return Response(
                    {'status_message': f'Authentication failed: {str(e)}'},
                    status=status.HTTP_401_UNAUTHORIZED
                )

            user_id = request.data.get('user_id') 
            if not user_id:
                return Response({'status_message': 'user_id is required'}, status=status.HTTP_400_BAD_REQUEST)

            user_obj = EndUser.objects.filter(id=user_id).first()
            if not user_obj:
                return Response({'status_message': 'User not found'}, status=status.HTTP_404_NOT_FOUND)

            project_id = request.data.get('project_id')
            project_obj = ProjectModule.objects.filter(id=project_id).first()
            if not project_obj:
                return Response({'status_message': 'Project not found'}, status=status.HTTP_404_NOT_FOUND)

            assignment = ProjectAssignment.objects.filter(user=user_obj, project=project_obj).first()
            if assignment:
                message = "Project already assigned"
            else:
                assignment = ProjectAssignment.objects.create(
                    user=user_obj,
                    project=project_obj,
                    status=request.data.get('status') 
                )
                message = "Project assigned successfully"

                EndUserNotifications.objects.create(
                    user=user_obj,             
                    message=f"You have been assigned to project '{project_obj}'",
                    type="project_assignment"
                )

            return Response({
                'status_message': message,
                'assignment': {
                    'id': assignment.id,
                    'project_id': assignment.project.id,
                    'user_id': assignment.user.id,
                    'status': assignment.status,
                    'assigned_at': assignment.assigned_at

                }
            }, status=status.HTTP_200_OK)

        except Exception as e:
            return Response({'status_message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

