from django.shortcuts import render
from django.conf import settings
from .forms import EmailForm, LoginForm, ClientProfileForm
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
import json
from .utils import sendMail, createOtp, verificationOfOtp, createUser
from django.contrib.auth.models import User
import string
from rest_framework_simplejwt.tokens import RefreshToken
from .models import UserProfile, Notifications
from django.core.files.storage import FileSystemStorage
from Client.models import Bookings
from django.db.models import Q
# Create your views here.


@csrf_exempt
@api_view(('POST',))
@authentication_classes([])
@permission_classes([])
def loginOne(request):
	if request.method == 'POST':
		form = EmailForm(request.POST)
		if form.is_valid():
			emailto = request.POST['email']

			# for generating Otp
			user = User.objects.filter(email=emailto)
			# raise Exception({user.exists()})
			if user.exists() == False:
				response = createUser(emailto)
				if response == False:
					return Response(status=status.HTTP_400_BAD_REQUEST, 
						data={
							'code': 'Error', 
							'message': 'Something went wrong while inserting user.', 
							'data': None
						}
					)

			user = user.first()
			if user.is_active != 1:
				return Response(status=status.HTTP_400_BAD_REQUEST, 
					data={
						'code': 'Error', 
						'message': 'User is blocked.', 
						'data': None
					}
				)
			try:
				if user.userprofile.category.is_active == 0:
					return Response(status=status.HTTP_400_BAD_REQUEST, 
						data={
							'code': 'Error', 
							'message': 'Category is disabled.', 
							'data': None
						}
					)
			except:
				pass
			otp = createOtp(user)
			if otp == 'time_diff_error':
				return Response(status=status.HTTP_400_BAD_REQUEST, 
					data={
						'code': 'Error', 
						'message': 'please try after sometime.', 
						'data': None
					}
				)
			subject = 'Hapsmiths OTP Verification'
			content = str(otp)
			template = "emails/otp_send.html"
			res = sendMail(subject, content, [emailto], template)
			# raise Exception(res)
			return Response(status=status.HTTP_200_OK, 
				data={
					'code': 'Success', 
					'message': 'Otp sent successfully, Please verify it to login!', 
					'data': None
				}
			)
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': form.errors
			}
		)
	return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED, 
		data={
			'code': 'Error', 
			'message': 'Wrong Method', 
			'data': None
		}
	)

@csrf_exempt
@api_view(('POST',))
@authentication_classes([])
@permission_classes([])
def verifyOtp(request):
	if request.method == 'POST':
		form = LoginForm(request.POST)
		if form.is_valid():
			email = request.POST['email']
			otp = request.POST['otp']
			user = User.objects.filter(email=email).first()
			verifyotp = verificationOfOtp(user, otp)
			if verifyotp == 'time_diff_error':
				return Response(status=status.HTTP_400_BAD_REQUEST, 
					data={
						'code': 'Error', 
						'message': 'OTP is expired',
						'data': None
					}
				)
			if verifyotp == False:
				return Response(status=status.HTTP_400_BAD_REQUEST, 
					data={
						'code': 'Error', 
						'message': 'Wrong OTP', 
						'data': None
					}
				)
			refresh = RefreshToken.for_user(user)
			return Response(status=status.HTTP_200_OK, 
				data={
					'code': 'Success', 
					'message': 'Otp varified successfully!', 
					'data': str(refresh.access_token)
				}
			)
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': form.errors
			}
		)
	return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED, 
		data={
			'code': 'Error', 
			'message': 'Wrong Method', 
			'data': None
		}
	)


@csrf_exempt
@api_view(('POST',))
def updateProfileClient(request):
	if request.method == 'POST':
		# if request.user.userprofile.user_type != 'coach':
		# if request.user.userprofile is not None and request.user.userprofile.user_type != 'client':
		# 	return Response(status=status.HTTP_400_BAD_REQUEST, 
		# 		data={
		# 			'code': 'Error', 
		# 			'message': 'Something went wrong', 
		# 			'data': {
		# 				'error': ['User is not coach']
		# 			}
		# 		}
		# 	)

		# raise Exception(request.user.userprofile.user_type)
		form = ClientProfileForm(request.POST)
		if form.is_valid():
			# raise Exception({request.user.date_joined})
			user = UserProfile.objects.filter(user_id=request.user.id).first()
			uploaded_file_url = 0;
			if len(request.FILES):
				myfile = request.FILES['profile_pic']
				folder=settings.MEDIA_ROOT_CLIENT+'/profile-pics/' 
				fs = FileSystemStorage(location=folder)
				filename = fs.save(myfile.name, myfile)
				uploaded_file_url = '/media/client/profile-pics/' + filename
			
			if user:
				user.name = request.POST['name']
				user.gender = request.POST['gender']
				user.dob = request.POST['dob']
				# user.category_id = request.POST['category']
				if uploaded_file_url:
					user.profile_pic = uploaded_file_url
				user.save()
			else:
				user = UserProfile.objects.create(user_id=request.user.id, name=request.POST['name'], gender=request.POST['gender'], dob=request.POST['dob'],profile_pic=uploaded_file_url)
				user.save()
			return Response(status=status.HTTP_200_OK, 
				data={
					'code': 'Success', 
					'message': 'Profile updated successfully!', 
					'data': ''
				}
			)
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': form.errors
			}
		)
	return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED, 
		data={
			'code': 'Error', 
			'message': 'Wrong Method', 
			'data': None
		}
	)

@csrf_exempt
@api_view(('GET',))
def getProfileDetail(request):
	user = UserProfile.objects.filter(user_id=request.user.id).first()
	return Response(status=status.HTTP_200_OK, 
		data={
			'code': 'Success', 
			'message': 'Data found successfully!', 
			'data': user.serialize
		}
	)

@api_view(('GET',))
def getNotification(request):
	if 'page_no' not in request.GET and request.GET['page_no'] == '':
		page_no = 1
	else:
		page_no = request.GET['page_no']

	notifications = Notifications.objects.filter(user_id=request.user.id).filter(~Q(status='d')).order_by('-id')[(10*(int(page_no)-1)):(10*(int(page_no)-1))+10]

	notifications = [i.serialize for i in notifications]
	return Response(status=status.HTTP_200_OK, 
		data={
			'code': 'Success', 
			'message': 'Data found successfully!', 
			'data': notifications
		}
	)

@api_view(('GET',))
def updateNotification(request, noti_id):
	if 'status' not in request.GET:
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': ['please put some status']
			}
		)
	if request.GET['status'] == 'r' or request.GET['status'] == 'd':
		status_req = request.GET['status']
		check_noti = Notifications.objects.filter(user_id=request.user.id, id=noti_id).first()

		if check_noti != None and check_noti.status != 'd':
			check_noti.status = status_req
			check_noti.save()

		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Data updated successfully!', 
				'data': ''
			}
		)
	return Response(status=status.HTTP_400_BAD_REQUEST, 
		data={
			'code': 'Error', 
			'message': 'Something went wrong', 
			'data': ['Invalid status']
		}
	)

@api_view(('GET',))
def getBookingLink(request, book_id):
	# raise Exception(request.user.id)
	if request.user.userprofile.user_type == 'coach':
		# check feedback
		check_feedback = Bookings.objects.filter(coach_id=request.user.id, booking__isnull=True, status='completed').values_list('id', 'user_id')
		# raise Exception(check_feedback)
		if len(check_feedback) > 0:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong',
					'data_key': check_feedback,		#use this ids to update rating
					'data': {
						'error': ['Please give previous session a rating.']
					}
				}
			)
		check_booking = Bookings.objects.filter(id=book_id, coach_id=request.user.id).values('zoom_link').first()
		if check_booking == None:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': ['Booking does not belongs to you']
				}
			)
		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Data found successfully!', 
				'data': check_booking
			}
		)
	elif request.user.userprofile.user_type == 'client':
		check_booking = Bookings.objects.filter(id=book_id, user_id=request.user.id).values('zoom_link').first()
		if check_booking == None:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': ['Booking does not belongs to you']
				}
			)
		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Data found successfully!', 
				'data': check_booking
			}
		)
	else:
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': ['Invalid booking']
			}
		)

@api_view(('POST',))
def support(request):
	if 'content' not in request.POST:
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': ['Content field is required']
			}
		)
	email = 'prashant@six30labs.io'
	content_to_send = {}
	content_to_send['content'] = request.POST['content']
	content_to_send['username'] = request.user.userprofile.name
	content_to_send['usertype'] = request.user.userprofile.user_type
	content_to_send['email'] = request.user.email

	subject = 'Hapsmiths Support'
	template = "emails/support.html"
	res = sendMail(subject, content_to_send, [email], template)

	return Response(status=status.HTTP_200_OK, 
		data={
			'code': 'Success', 
			'message': 'Mail sent successfully!', 
			'data': ''
		}
	)