from django.db import models
from django.contrib.auth.models import User
from Employee.models import Timeslots, Notes

# from CommonApp.models import *
from CommonApp.models import Category
from CommonApp.models import Company
# from django.apps import apps
# Company = apps.get_model('CommonApp', 'Company')
from datetime import datetime
import CommonApp

class SoftDeleteModel(models.Model):

    is_deleted = models.BooleanField(default=False)

    def soft_delete(self):
        self.is_deleted = True
        self.save()

    def restore(self):
        self.is_deleted = False
        self.save()

    class Meta:
        abstract = True

# Create your models here.
class Bookings(models.Model):
	coach=models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='coach')
	user=models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='client')
	timeslot=models.ForeignKey(Timeslots, on_delete=models.CASCADE, default=None)

	session_date=models.CharField(max_length=100, default=None)
	session_time=models.CharField(max_length=100, default=None)
	status=models.CharField(max_length=10, default='pending')	#pending, completed, cancelled, 
	cancelled_by=models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='cancelled_by')
	cancelled_at=models.CharField(max_length=100, null=True, blank=True)
	created_at=models.DateTimeField(auto_now_add=True)
	updated_at=models.DateTimeField(auto_now=True)
	is_relation_paused=models.CharField(max_length=10, default='no', editable=False)  # yes, no, null
	zoom_link=models.TextField(null=True, blank=True)
	reason=models.CharField(max_length=255, null=True, blank=True)
	coach_joined_at=models.CharField(max_length=100, null=True, blank=True)
	client_joined_at=models.CharField(max_length=100, null=True, blank=True)

	#dta = Messages.objects.filter(id=1).first()
	#raise Exception(dta)
	category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True, related_name='booking_category')
	company=models.ForeignKey(Company, on_delete=models.CASCADE, null=True, blank=True, related_name='booking_company')
	def __str__(self):
		return self.session_date

	@property
	def serialize(self):
		# raise Exception(self.name)
		dic = {}
		dic['id'] = self.id
		dic['coach_id'] = self.coach_id
		dic['coach_name'] = self.coach.userprofile.name
		dic['coach_profile_pic'] = str(self.coach.userprofile.profile_pic)
		dic['coach_email'] = self.coach.email
		dic['coach_category'] = self.coach.userprofile.category.name
		dic['coach_category_id'] = self.coach.userprofile.category.id
		dic['user_id'] = self.user_id
		dic['user_name'] = self.user.userprofile.name
		dic['user_profile_pic'] = str(self.user.userprofile.profile_pic)
		dic['user_email'] = self.user.email
		dic['timeslot_id'] = self.timeslot_id
		dic['session_date'] = self.session_date
		dic['session_time'] = self.session_time
		dic['status'] = self.status
		dic['cancelled_by_id'] = self.cancelled_by_id
		dic['cancelled_at'] = self.cancelled_at
		dic['created_at'] = self.created_at
		dic['updated_at'] = self.updated_at
		dic['is_relation_paused'] = self.is_relation_paused
		dic['category_id'] = self.category_id
		dic['company_id'] = self.company_id
		try:
			dic['all_unread_messages'] = self.unread_msgs
		except:
			dic['all_unread_messages'] = 0
		try:
			today = datetime.today()

			year = today.year
			month = today.month
			day = today.day
			# last_note = Notes.objects.filter(client_id=self.user_id, coach_id=self.coach_id, created_at__day=day, created_at__month=month, created_at__year=year, is_deleted=0).order_by('-id').first()
			last_note = Notes.objects.raw(''' SELECT `Employee_notes`.`id`, `Employee_notes`.`is_deleted`, `Employee_notes`.`coach_id`, `Employee_notes`.`client_id`, `Employee_notes`.`data`, `Employee_notes`.`is_pinned`, `Employee_notes`.`created_at`, `Employee_notes`.`updated_at` FROM `Employee_notes` WHERE (`Employee_notes`.`client_id` = %s AND `Employee_notes`.`coach_id` = %s AND EXTRACT(DAY FROM `Employee_notes`.`created_at`) = %s AND EXTRACT(MONTH FROM `Employee_notes`.`created_at`) = %s AND EXTRACT(YEAR FROM `Employee_notes`.`created_at`) = %s AND NOT `Employee_notes`.`is_deleted`) ORDER BY `Employee_notes`.`id` DESC LIMIT 1 ''', [self.user_id, self.coach_id, day, month, year])
			# raise Exception(last_note[0].serialize)
			dic['last_note'] = last_note[0].serialize
		except:
			dic['last_note'] = None
		# dic['zoom_link'] = self.zoom_link
		last_message = CommonApp.models.Messages.objects.filter(booking_id=self.id).order_by('-id').first()
		if last_message != None:
			dic['last_message'] = last_message.serialize
		else:
			dic['last_message'] = None
		# raise Exception(dic['last_message'])
		return dic

class UserReports(models.Model):
	reported_by = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='reported_by')
	reported_to = models.ForeignKey(User, on_delete=models.CASCADE, default=None, related_name='reported_to')
	reason = models.CharField(max_length=255, 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['reason'] = self.reason
		dic['created_at'] = self.created_at
		dic['updated_at'] = self.updated_at
		dic['status'] = 'yes'
