import json
import datetime
from Employee.models import Timeslots, Leaves
from CommonApp.models import UserProfile
from .models import Bookings
from django.db.models import Q

def checkSlotIsAvailable(category_id, date, slot, coach_id, client_id):
	
	check_slot_entry = Timeslots.objects.filter(coach_id=coach_id).count()
	if check_slot_entry == 0:
		return {
			'return': False,
			'message': 'Coach have not assigned any slot yet.'
		}
	day_name= ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday']
	day = datetime.datetime.strptime(date, '%Y-%m-%d').weekday()

	get_slots = Timeslots.objects.filter(coach_id=coach_id, day_name=day_name[day]).first()

	coach = UserProfile.objects.filter(user_id=coach_id).first()
	# raise Exception(coach.serialize['coach_time_slot'])
	if coach.serialize['coach_time_slot'] == None:
		return {
			'return': False,
			'message': 'Coach does not have any slot division.'
		}

	if get_slots and json.loads(get_slots.slots) != "":
		slots = json.loads(get_slots.slots).split(',')
		time = None
		if coach.serialize['coach_time_slot'] == '60_min':
			if slot in slots:
				time = slot
		else:
			# time = slot.split(':')[0] + ':' + '00'
			# raise Exception(time in slots, 'lolz')
			# if (slot.split(':')[0] + ':' + '00') in slots:
			# 	time = slot.split(':')[0] + ':' + ('30' if (int(slot.split(':')[1]) >= 30 and int(slot.split(':')[1]) <= 59) else '00')

			if slot in slots:
				time = slot
		# raise Exception(time, slot, slot in slots, slots)
		if time:
			# check whether the same slot is booked for the client in different category 
			check_booked_in_diff_cate = Bookings.objects.filter(session_date=date, session_time=time, user_id=client_id, status='pending').first()
			if check_booked_in_diff_cate != None:
				return {
					'return': False,
					'message': 'The same slot is already booked for "'+check_booked_in_diff_cate.coach.userprofile.category.name+'"'
				}
			# check this time slot is available or booked
			is_booked = Bookings.objects.filter(session_date=date, session_time=time, coach_id=coach_id, status='pending')
			# raise Exception(time, 'hii')
			if is_booked:
				return {
					'return': False,
					'message': 'This slot is already booked'
				}
			else:
				# checking that leave has been taken by the user for this date or not
				check_leave_taken = Leaves.objects.filter(user_id=coach_id).filter(Q(leave_from_date__lte=date) & Q(leave_to_date__gte=date) | Q(leave_from_date=date) & Q(leave_to_date__isnull=True)).first()
				if check_leave_taken:

					if check_leave_taken.leave_from_date == date:
						leave_taken_slots = (check_leave_taken.slots_leave_from).split(',')

					elif check_leave_taken.leave_to_date == date:
						leave_taken_slots = (check_leave_taken.slots_leave_to).split(',')

					elif check_leave_taken.leave_from_date < date and check_leave_taken.leave_to_date > date:
						# checking full day leave
						# raise Exception(type(check_leave_taken.leave_to_date) , type(date))
						return {
							'return': False,
							'message': 'Coach is not available on this date and time(Full day)'
						}

					else:
						leave_taken_slots = []

					# raise Exception(leave_taken_slots, len(leave_taken_slots) > 0 and (time in leave_taken_slots), time)
					# if len(leave_taken_slots) > 0 and ((time.split(':')[0] + ':' + '00') in leave_taken_slots):
					if len(leave_taken_slots) > 0 and (time in leave_taken_slots):
						return {
							'return': False,
							'message': 'Coach is not available on this date and time (Half day)'
						}
					# raise Exception(check_leave_taken)
				# end checking
				return {
					'return': True,
				}
		else:
			return {
				'return': False,
				'message': 'slot value is incorrect'
			}
	else:
		return {
			'return': False,
			'message': 'Slot is not available for this coach'
		}

		
		
