from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.response import Response
from rest_framework import status
from django.conf import settings

from django.core.files.storage import FileSystemStorage

from CommonApp.forms import SendMessageForm, OpenChatForm, updateBookingStatusForm
from CommonApp.models import Messages, UserProfile
# from CommonApp.utils import CreateNotification
from Client.models import Bookings, UserReports
from Employee.models import Notes

from django.db import connection
from django.db.models import Q

import datetime

@csrf_exempt
@api_view(('POST',))
def sendMessage(request):
	# raise Exception(request.POST)
	form = SendMessageForm(request.POST)
	if form.is_valid():
		
		message_from = request.POST['message_from']
		message_to = request.POST['message_to']
		booking_id = request.POST['booking_id']
		message = request.POST['message']
		# raise Exception(str(request.user.id) != message_from)
		if str(request.user.id) != message_from:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': {
						'error': ['Invalid Sender']
					}
				}
			)
		check_user_from = UserProfile.objects.filter(user_id=message_from).first()
		if check_user_from.user_type == 'client':
			user_id = message_from
			coach_id = message_to
		else:
			user_id = message_to
			coach_id = message_from

		# check for bookings is available and relationship is still there or not
		booking = Bookings.objects.filter(user_id=user_id, coach_id=coach_id, id=booking_id).order_by('-id').first()
		if not booking:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': {
						'error': ['Either Booking does not exists or User associated with booking does not exists']
					}
				}
			)
		if booking.is_relation_paused == 'yes':
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': {
						'error': ['Your relation is paused, You can not send message to this user']
					}
				}
			)
		message_type = 't'
		if message_type in request.POST and request.POST['message_type'] == 'l':
			message_type = 'l'   		# l=label
		# check if file is being uploaded or not
		uploaded_file_url = None;
		if len(request.FILES):
			myfile = request.FILES['message_file']
			folder=settings.MEDIA_ROOT_MESSAGE+'/messages-files/' 
			fs = FileSystemStorage(location=folder)
			filename = fs.save(myfile.name, myfile)
			uploaded_file_url = '/media/message/messages-files/' + filename

			message_type = 'f'
			if str(request.FILES["message_file"]).split('.')[len(str(request.FILES["message_file"]).split('.')) -1] in ['jpg', 'jpeg', 'png', 'gif', 'svg']:
				message_type = 'i'

		# raise Exception(request.user.id , message_from, message_type)
		if 'message' not in request.POST and uploaded_file_url == None:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': {
						'error': ['Enter message to send']
					}
				}
			)
		currentdate = datetime.date.today()
		formatDate = currentdate.strftime("%d %b, %Y")
		# raise Exception(formatDate)
		try:
			today = datetime.datetime.today()
			year = today.year
			month = today.month
			day = today.day
			today_message = Messages.objects.raw(''' SELECT `CommonApp_messages`.`id` FROM `CommonApp_messages` WHERE (`CommonApp_messages`.`from_user_id` = %s AND `CommonApp_messages`.`to_user_id` = %s AND EXTRACT(DAY FROM `CommonApp_messages`.`created_at`) = %s AND EXTRACT(MONTH FROM `CommonApp_messages`.`created_at`) = %s AND EXTRACT(YEAR FROM `CommonApp_messages`.`created_at`) = %s) ORDER BY `CommonApp_messages`.`id` DESC LIMIT 1 ''', [message_from, message_to, day, month, year])
			# raise Exception(today_message[0].serialize['from_user_id'])
			if today_message[0].serialize['from_user_id'] > 0:
				pass
			else:
				ssage = Messages.objects.create(message=formatDate, message_type='div', file_link=None, booking_id=booking_id, from_user_id=message_from, to_user_id=message_to)
				ssage.save()
		except:
			ssage = Messages.objects.create(message=formatDate, message_type='div', file_link=None, booking_id=booking_id, from_user_id=message_from, to_user_id=message_to)
			ssage.save()

		create_message = Messages.objects.create(message=message, message_type=message_type, file_link=uploaded_file_url, booking_id=booking_id, from_user_id=message_from, to_user_id=message_to)
		create_message.save()


		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Message sent!', 
				'data': ''
			}
		)
	return Response(status=status.HTTP_400_BAD_REQUEST, 
		data={
			'code': 'Error', 
			'message': 'Something went wrong', 
			'data': form.errors
		}
	)

@csrf_exempt
@api_view(('GET',))
def listOfUsersInChat(request):
	# raise Exception(request.user.id)
	if request.user.userprofile.user_type == 'client':
		bookings = Bookings.objects.raw('''SELECT Client_bookings.*, CommonApp_messages.booking_id, (CASE WHEN Client_bookings.is_relation_paused = "yes" THEN 0 ELSE 1 END) AS relation, (SELECT count(CommonApp_messages.id) FROM CommonApp_messages WHERE CommonApp_messages.from_user_id=Client_bookings.coach_id AND CommonApp_messages.to_user_id=%s AND status="n") AS unread_msgs FROM Client_bookings LEFT JOIN CommonApp_messages ON Client_bookings.id = CommonApp_messages.booking_id AND CommonApp_messages.id IN (SELECT 
            MAX(CommonApp_messages.id)
        FROM CommonApp_messages WHERE CommonApp_messages.booking_id=Client_bookings.id
        GROUP BY CommonApp_messages.booking_id) WHERE Client_bookings.id IN (SELECT 
            MAX(Client_bookings.id)
        FROM Client_bookings WHERE Client_bookings.user_id=%s
        GROUP BY Client_bookings.coach_id) AND Client_bookings.user_id = %s GROUP BY Client_bookings.coach_id ORDER BY relation DESC, CommonApp_messages.created_at DESC''',[request.user.id, request.user.id, request.user.id])

	elif 'for_notes' in request.GET and request.GET['for_notes'] != '' and request.GET['for_notes'] == '1' and request.user.userprofile.user_type == 'coach':
		bookings = Notes.objects.raw('''SELECT Employee_notes.* FROM Employee_notes WHERE Employee_notes.id IN (SELECT MAX(Employee_notes.id) FROM Employee_notes WHERE Employee_notes.coach_id=%s GROUP BY Employee_notes.client_id) AND Employee_notes.coach_id = %s GROUP BY Employee_notes.client_id ORDER BY Employee_notes.updated_at DESC''',[request.user.id,request.user.id])

	elif request.user.userprofile.user_type == 'coach':
		bookings = Bookings.objects.raw('''SELECT Client_bookings.*, CommonApp_messages.booking_id, (CASE WHEN Client_bookings.is_relation_paused = "yes" THEN 0 ELSE 1 END) AS relation, (SELECT count(CommonApp_messages.id) FROM CommonApp_messages WHERE CommonApp_messages.from_user_id=%s AND CommonApp_messages.to_user_id=Client_bookings.coach_id AND status="n") AS unread_msgs FROM Client_bookings LEFT JOIN CommonApp_messages ON Client_bookings.id = CommonApp_messages.booking_id AND CommonApp_messages.id IN (SELECT 
            MAX(CommonApp_messages.id)
        FROM CommonApp_messages WHERE CommonApp_messages.booking_id=Client_bookings.id
        GROUP BY CommonApp_messages.booking_id) WHERE Client_bookings.id IN (SELECT 
            MAX(Client_bookings.id)
        FROM Client_bookings WHERE Client_bookings.coach_id=%s
        GROUP BY Client_bookings.user_id) AND Client_bookings.coach_id = %s GROUP BY Client_bookings.user_id ORDER BY relation DESC, CommonApp_messages.created_at DESC''',[request.user.id, request.user.id,request.user.id])

	else:
		return Response(status=status.HTTP_400_BAD_REQUEST, 
			data={
				'code': 'Error', 
				'message': 'Something went wrong', 
				'data': {
					'error': ['You are neither client nor coach']
				}
			}
		)
	# raise Exception(list(bookings))
	bookings = [i.serialize for i in bookings]
	return Response(status=status.HTTP_200_OK, 
		data={
			'code': 'Success', 
			'message': 'Data Found!', 
			'data': bookings
		}
	)

@csrf_exempt
@api_view(('POST',))
def openChat(request):
	# request.POST['auth_user_id'] = request.user.id
	form = OpenChatForm(request.POST)
	if form.is_valid():
		messages_update = Messages.objects.filter(from_user_id=request.POST['person_id'], to_user_id=request.user.id)
		messages_update.update(status='r')

		messages = Messages.objects.filter(Q(from_user_id=request.user.id, to_user_id=request.POST['person_id']) | Q(from_user_id=request.POST['person_id'], to_user_id=request.user.id)).order_by('-created_at', 'id')[(25*(int(request.POST['page_no'])-1)):(25*(int(request.POST['page_no'])-1))+25]
		messages = reversed(messages)
		messages = [i.serialize for i in messages]

		# for getting status whether coach has flagged the user or not
		if request.user.userprofile.user_type == 'coach':
			is_user_flagged = UserReports.objects.filter(reported_by_id=request.user.id, reported_to_id=request.POST['person_id']).first()
			# raise Exception(is_user_flagged)
			if is_user_flagged != None:
				is_user_flagged = 1
			else:
				is_user_flagged = 0
		else:
			is_user_flagged = None

		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Data Found!', 
				'data': messages,
				'is_user_flagged': is_user_flagged
			}
		)
	return Response(status=status.HTTP_400_BAD_REQUEST, 
		data={
			'code': 'Error', 
			'message': 'Something went wrong', 
			'data': form.errors
		}
	)

@csrf_exempt
@api_view(('POST',))
def openProfile(request):
	form = OpenChatForm(request.POST)
	if form.is_valid():
		user_profile = UserProfile.objects.filter(user_id=request.POST['person_id']).first()
		user_is_reported = UserReports.objects.filter(reported_by_id=request.user.id, reported_to_id=request.POST['person_id']).count()
		if user_is_reported == 0:
			is_reported = 0
		else:
			is_reported = 1
		# raise Exception(user_profile)
		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Data Found!', 
				'data': user_profile.serialize,
				'is_reported': is_reported
			}
		)
	return Response(status=status.HTTP_400_BAD_REQUEST, 
		data={
			'code': 'Error', 
			'message': 'Something went wrong', 
			'data': form.errors
		}
	)

@csrf_exempt
@api_view(('GET',))
def getSharedMedia(request):
	# raise Exception('user' in request.GET and request.GET['user'] != '' )
	if 'user' in request.GET and request.GET['user'] != '':
		if 'page_no' not in request.GET and request.GET['page_no'] == '':
			page_no = 1
		else:
			page_no = request.GET['page_no']

		medias = Messages.objects.filter(Q(from_user_id=request.user.id, to_user_id=request.GET['user']) | Q(from_user_id=request.GET['user'], to_user_id=request.user.id)).filter(Q(message_type='f') | Q(message_type='i')).order_by('-id')[(10*(int(page_no)-1)):(10*(int(page_no)-1))+10]
		media = [i.serialize for i in medias]

		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Data Found!', 
				'data': media
			}
		)

	return Response(status=status.HTTP_400_BAD_REQUEST, 
		data={
			'code': 'Error', 
			'message': 'Something went wrong', 
			'data': ['No user has been selected']
		}
	)

@csrf_exempt
@api_view(('POST',))
def updateBookingStatus(request):
	form = updateBookingStatusForm(request.POST)
	if form.is_valid():
		booking_id = request.POST['booking_id']
		person_id = request.POST['person_id']
		# status = request.POST['status']
		if request.user.userprofile.user_type == 'coach':
			check_booking = Bookings.objects.filter(coach_id=request.user.id, user_id=person_id, id=booking_id).first()
		else:
			check_booking = Bookings.objects.filter(user_id=request.user.id, coach_id=person_id, id=booking_id).first()
		if check_booking == None:
			return Response(status=status.HTTP_400_BAD_REQUEST, 
				data={
					'code': 'Error', 
					'message': 'Something went wrong', 
					'data': {
						'error': ['Invalid Booking']
					}
				}
			)
		# if check_booking.status != 'pending':
		# 	return Response(status=status.HTTP_400_BAD_REQUEST, 
		# 		data={
		# 			'code': 'Error', 
		# 			'message': 'Something went wrong', 
		# 			'data': {
		# 				'error': ['Booking status should be pending to change the status as completed']
		# 			}
		# 		}
		# 	)
		check_booking.status = 'completed'
		if request.user.userprofile.user_type == 'coach':
			check_booking.coach_joined_at = datetime.datetime.now()
		else:
			check_booking.client_joined_at = datetime.datetime.now()
		check_booking.save()

		return Response(status=status.HTTP_200_OK, 
			data={
				'code': 'Success', 
				'message': 'Status changed Successfully!', 
				'data': ''
			}
		)

	return Response(status=status.HTTP_400_BAD_REQUEST, 
		data={
			'code': 'Error', 
			'message': 'Something went wrong', 
			'data': form.errors
		}
	)

