from django.db import models
from django.contrib.auth.models import User
# from CommonApp.models import Company
# from .models import Company
from django.db.models import Count
import json
import datetime 
# Create your models here.

class Category(models.Model):
	name = models.CharField(max_length=100, null=True, blank=True)
	details = models.TextField(null=True, blank=True)
	logo = models.CharField(max_length=200, null=True, blank=True)
	time = models.CharField(max_length=100, null=True, blank=True)
	slug = models.CharField(max_length=100, null=True, blank=True)
	color_code = models.CharField(max_length=100, null=True, blank=True)
	default_color_code = models.CharField(max_length=100, null=True, blank=True)
	category_order = models.IntegerField(max_length=10, default=0)	#0,1
	is_active = models.IntegerField(max_length=10, default=1)	#0,1
	
class Otp(models.Model):
	user = models.ForeignKey(User, on_delete=models.CASCADE, default=None)
	otp_type = models.CharField(max_length=20, null=True, blank=True)
	otp = models.IntegerField(default=None)
	status = models.CharField(max_length=10,default="n")	#n=new, v=verified, d=deleted, 
	veified_at = models.CharField(max_length=100, default="")
	time = models.CharField(max_length=100, null=True, blank=True)

class Company(models.Model):
	name = models.CharField(max_length=100, null=True, blank=True)
	domain = models.CharField(max_length=200, null=True, blank=True)
	status = models.CharField(max_length=20, default='a')	#a=active, i=inactive
	joined_date = models.DateTimeField(auto_now_add=True, null=True, blank=True)
	expiry_date = models.CharField(max_length=100, null=True, blank=True)
	location = models.CharField(max_length=100, null=True, blank=True)
	number_of_employees = models.CharField(max_length=100, null=True, blank=True)
	name_of_person = models.CharField(max_length=100, null=True, blank=True)
	contact_of_person = models.CharField(max_length=100, null=True, blank=True)

from Client.models import Bookings
class UserProfile(models.Model):
	user = models.OneToOneField(User, on_delete=models.CASCADE, default=None)
	name = models.CharField(max_length=100, null=True, blank=True)
	gender = models.CharField(max_length=20, null=True, blank=True)
	profile_pic = models.FileField(upload_to='images/', null=True, blank=True)
	dob = models.CharField(max_length=100, null=True, blank=True)
	lgbtq = models.CharField(max_length=100, null=True, blank=True)		# Null=not , y=positive
	user_type = models.CharField(max_length=20, null=True, blank=True, default='client')
	category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
	coach_time_slot = models.CharField(max_length=50, null=True, blank=True)	#30_min, 60_min
	coach_ms_user_id = models.CharField(max_length=200, null=True, blank=True)
	company = models.ForeignKey(Company, on_delete=models.CASCADE, null=True, blank=True)
	specializations = models.TextField(null=True, blank=True)
	menu_list = models.TextField(null=True, blank=True)
	description = models.TextField(null=True, blank=True)
	@property
	def serialize(self):
		dic = {}
		l = {}
		dic["id"] = self.id
		dic["name"] = self.name
		dic["user_id"] = self.user_id
		dic["gender"] = self.gender
		dic["profile_pic"] = str(self.profile_pic)
		dic["dob"] = self.dob
		dic["user_type"] = self.user_type
		dic["username"] = self.user.username
		dic["email"] = self.user.email
		dic["date_joined"] = self.user.date_joined
		dic["is_active"] = self.user.is_active
		dic["coach_time_slot"] = self.coach_time_slot
		dic["coach_ms_user_id"] = self.coach_ms_user_id
		dic["category_name"] = None if self.category == None else self.category.name
		# dic["posts"] = [l for i in self.user.sandwiches.all()]
		dic["languages"] = [l.serialize for l in self.user.languages.filter(user=self.user)]
		try:
			cmpny = Company.objects.filter(domain=self.user.email.split('@')[1]).values('name').first()
			dic['company_name'] = cmpny['name']
		except:
			dic['company_name'] = None
		dic['specializations'] = None if self.specializations == None else self.specializations.split(',')
		if self.user_type == 'coach':
			dic['no_of_clients'] = (Bookings.objects.values('user_id').filter(coach_id=self.user_id).annotate(total=Count('id'))).count()
			dic['no_of_sessions'] = Bookings.objects.filter(coach_id=self.user_id).count()
			# raise Exception(str(datetime.datetime.now().hour)+':'+str(datetime.datetime.now().minute))
		if self.user_type == 'client':
			dic['upcoming_sessions'] = Bookings.objects.filter(session_date__gte=datetime.datetime.now().date(), session_time__gte=str(datetime.datetime.now().hour)+':'+str(datetime.datetime.now().minute), user_id=self.user_id, status='pending').count()
		else:
			dic['upcoming_sessions'] = 0
		dic['description'] = self.description
		dic['lgbtq'] = self.lgbtq
		return dic


class Language(models.Model):
	name = models.CharField(max_length=100, null=True, blank=True, unique=True)
	time = models.CharField(max_length=100, null=True, blank=True)
	user = models.ManyToManyField(User, related_name="languages")
	created_at=models.DateTimeField(auto_now_add=True)
	updated_at=models.DateTimeField(auto_now=True)
	@property
	def serialize(self):
		dic = {}
		dic["id"] = str(self.id)
		dic["name"] = str(self.name)
		dic["time"] = str(self.time)
		# dic["profile_pic"] = str(self.profile_pic)
		# dic["dob"] = str(self.dob)
		# dic["user_type"] = str(self.user_type)
		# dic["username"] = self.user.username
		# dic["email"] = self.user.email
		# dic["is_active"] = self.user.is_active
		# dic["users"] = [l for i in self.user]
		return dic

class Messages(models.Model):
	from_user = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='from_user')
	to_user = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='to_user')
	booking = models.ForeignKey(Bookings, on_delete=models.CASCADE, default=None)
	message = models.CharField(max_length=255, null=True, blank=True)
	message_type = models.CharField(max_length=15, null=True, blank=True) #t=text, f=file, i=image
	file_link = models.CharField(max_length=150, null=True, blank=True)
	status = models.CharField(max_length=15, default='n', editable=False) #n=not read, r=read
	is_deleted=models.CharField(max_length=10, default='n', editable=False) #n=no, y=yes
	created_at=models.DateTimeField(auto_now_add=True)
	updated_at=models.DateTimeField(auto_now=True)

	@property
	def serialize(self):
		dic = {}
		dic['from_user_id'] = self.from_user_id
		dic['to_user_id']   = self.to_user_id
		dic['booking_id']   = self.booking_id
		dic['booking_coach_id']   	= self.booking.coach_id
		dic['booking_client_id']   	= self.booking.user_id
		dic['booking_session_date']   	= self.booking.session_date
		dic['booking_session_time']   	= self.booking.session_time
		dic['booking_status']   	= self.booking.status
		try:
			dic['booking_category_name']   	= self.booking.category.name
			dic['booking_category_color']   = self.booking.category.color_code
			dic['booking_category_icon']   	= self.booking.category.logo
			dic['booking_category_ctive']   = self.booking.category.is_active
		except:
			dic['booking_category_name']   	= None
			dic['booking_category_color']   = None
			dic['booking_category_icon']   	= None
			dic['booking_category_ctive']   = None

		dic['booking_category_id']   	= self.booking.coach.userprofile.category_id
		dic['message']      = self.message
		dic['message_type'] = self.message_type
		dic['file_link']    = self.file_link
		dic['status']       = self.status
		dic['is_deleted']   = self.is_deleted
		dic['created_at']   = self.created_at
		dic['date']   		= self.created_at
		dic['updated_at']   = self.updated_at
		return dic

class Notifications(models.Model):
	user 	   = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='notification_user')
	from_user  = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='notification_from_user')
	category  = models.ForeignKey(Category, on_delete=models.CASCADE, default=None, related_name='notification_category')
	noti_type  = models.CharField(max_length=50, null=True, blank=True)  #register, booking, booking_cancel, leave_request, leave_approved, leave cancel, 
	related_id = models.IntegerField(null=True, blank=True)
	status     = models.CharField(max_length=10, default='n', editable=False) #n=not read yet, r=read, d=deleted
	noti_text  = models.CharField(max_length=250, null=True, blank=True)
	created_at = models.DateTimeField(auto_now_add=True)
	updated_at = models.DateTimeField(auto_now=True)

	@property
	def serialize(self):
		dic = {}
		dic['id'] = self.id
		dic['category_id'] = self.category_id
		dic['category_name'] = self.category.name
		dic['user_id'] = self.user_id
		dic['user_name'] = self.user.first_name + ' ' + self.user.last_name
		dic['user_email'] = self.user.email
		dic['from_user_id'] = self.from_user_id
		dic['from_user_name'] = self.from_user.first_name + ' ' + self.from_user.last_name
		dic['from_user_email'] = self.from_user.email
		dic['noti_type'] = self.noti_type
		dic['related_id'] = self.related_id
		dic['status'] = self.status
		dic['noti_text'] = self.noti_text
		dic['created_at'] = self.created_at
		dic['updated_at'] = self.updated_at
		return dic


class Ratings(models.Model):
	given_by = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='rating_given_by')
	given_to = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='rating_given_to')
	booking = models.ForeignKey(Bookings, on_delete=models.CASCADE, null=True, blank=True, related_name='booking')
	rating = models.IntegerField(default=0, editable=False)		#for coach
	rating_exp_livup = models.IntegerField(default=0, editable=False)	#for livup app
	rating_type = models.CharField(max_length=25, null=True, blank=True)	#therapist, app, session
	feedback = models.CharField(max_length=250, null=True, blank=True)	#additional feedback
	created_at=models.DateTimeField(auto_now_add=True)
	updated_at=models.DateTimeField(auto_now=True)