from django import forms
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
# from .models import Company
from django.utils import timezone
from CommonApp.models import UserProfile
from Client.models import Bookings
from Employee.models import Notes

import datetime

class TemplateForm(forms.Form):
	# subject = forms.CharField(max_length=100)
	# message = forms.CharField(required=True)
	days_name = forms.CharField(required=True)
	def clean_days_name(self):
		days_name = self.cleaned_data['days_name']
		# raise Exception(days_name)
		days = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
		check = all(item in days for item in days_name)
		if check == False:
			raise ValidationError(_('Days are not correct'))
		return days_name

# class LoginForm(forms.Form):
# 	# subject = forms.CharField(max_length=100)
# 	otp = forms.CharField(required=True, max_length=4, min_length=4)
# 	email = forms.EmailField(required=True)
# 	def clean_email(self):
# 		data = self.cleaned_data['email']
# 		try:
# 			match = User.objects.get(email=data)
# 		except User.DoesNotExist:
# 			# Unable to find a user, this is fine
# 			raise ValidationError(_('Invalid email - Email does not exists'))
# 		return data

# class ClientProfileForm(forms.Form):
# 	name = forms.CharField(required=True)
# 	gender = forms.CharField(required=True, max_length=20)
# 	def clean_gender(self):
# 		data = self.cleaned_data['gender']
# 		if data == 'Male' or data=='Female' or data == 'Others':
# 			pass
# 		else:
# 			raise ValidationError(_('Invalid gender - Gender field is not proper'))
# 		return data
# 	dob = forms.CharField(required=True)
# 	profile_pic = forms.FileField(required=False)

class CreateNotesForm(forms.Form):
	client_id = forms.IntegerField(required=True)
	def clean_client_id(self):
		data = self.cleaned_data['client_id']
		check = UserProfile.objects.get(user_id=data)
		if check == None:
			raise ValidationError(_('Client is required - Client is not available'))
		return data
	data = forms.CharField(required=True)

class UpdateNotesForm(forms.Form):
	note_id = forms.IntegerField(required=True)
	def clean_note_id(self):
		data = self.cleaned_data['note_id']
		check_note = Notes.objects.filter(id=data).first()
		if check_note is None:
			raise ValidationError(_('Note is not available'))
		return data
	client_id = forms.IntegerField(required=True)
	def clean_client_id(self):
		data = self.cleaned_data['client_id']
		check = UserProfile.objects.get(user_id=data)
		if check == None:
			raise ValidationError(_('Client is required - Client is not available'))
		return data
	data = forms.CharField(required=True)

class GetNotesForm(forms.Form):
	pass

class CancelBooking(forms.Form):
	booking_id = forms.IntegerField(required=True)
	def clean_booking_id(self):
		data = self.cleaned_data['booking_id']
		booking = Bookings.objects.filter(id=data).first()
		if booking == None:
			raise ValidationError(_('Booking is not available '))
		# raise Exception(datetime.datetime.strptime(booking.session_date,'%Y-%m-%d').date() < timezone.now().date())
		if datetime.datetime.strptime(booking.session_date,'%Y-%m-%d').date() < timezone.now().date():
			raise ValidationError('Booking date is expired already')
		if datetime.datetime.strptime(booking.session_date,'%Y-%M-%d').date() == timezone.now().date() and datetime.datetime.strptime(booking.session_time,'%H:%M').time() < datetime.datetime.now().time():
			raise ValidationError('Booking time is expired already')
		if booking.status == 'cancelled':
			raise ValidationError(_('Booking already cancelled'))
		return data
	reason = forms.CharField(required=True)

class ReportClient(forms.Form):
	client_id = forms.IntegerField(required=True)
	def clean_client_id(self):
		data = self.cleaned_data['client_id']
		check = UserProfile.objects.get(user_id=data, user_type='client')
		if check == None:
			raise ValidationError(_('Client is required - Client is not available'))
		return data
	# reason = forms.CharField(required=True)

class GenerateMSMeetingLinkAgain(forms.Form):
	client_id = forms.IntegerField(required=True)
	def clean_client_id(self):
		client_id = self.cleaned_data['client_id']
		check_client = UserProfile.objects.filter(user_id=client_id, user_type='client').first()
		if check_client == None:
			raise ValidationError(_('Client is required - Either Client is not available or Invalid id'))
		return client_id
	booking_id = forms.IntegerField(required=True)
	def clean_booking_id(self):
		data = self.cleaned_data['booking_id']
		client_id = self.cleaned_data['client_id']
		check_booking = Bookings.objects.filter(id=data, user_id=client_id).first()
		if check_booking == None:
			raise ValidationError(_('Invalid Booking or Booking does not belongs to this client'))
		return data

class StarRatingFormClient(forms.Form):
	client_id = forms.IntegerField(required=True)
	def clean_client_id(self):
	    data = self.cleaned_data['client_id']
	    # raise Exception(timezone.now().date())
	    coach = UserProfile.objects.filter(user_id=data, user_type='client').count()
	    if coach == 0:
	        raise forms.ValidationError("Invalid client selection.")
	    return data
	rating = forms.FloatField(required=True)
	def clean_rating(self):
		data = self.cleaned_data['rating']
		if data < 1 or data > 5:
			raise forms.ValidationError("Invalid rating.")
		return data
	booking_id = forms.IntegerField(required=True)
	rating_type = forms.CharField(required=True)
	def clean_rating_type(self):
		data = self.cleaned_data['rating_type']
		list_type = ['client','app','session']
		if data not in list_type:
			raise forms.ValidationError("Invalid type.")
		return data
	rating_exp_livup = forms.IntegerField(required=True)
	def clean_rating_exp_livup(self):
		data = self.cleaned_data['rating_exp_livup']
		if data < 1 or data > 5:
			raise forms.ValidationError("Invalid rating for Hapsmiths.")
		return data