from django.conf import settings
from django.core.mail import send_mail
from django.contrib.auth.models import User
from .models import Otp, Notifications
import random
from django.utils import timezone
from django.utils.timezone import utc
import jwt
from time import time
import requests
import json
from datetime import datetime
from datetime import timedelta
from django.core.mail import EmailMessage
from django.template import Context
from django.template.loader import get_template

from dateutil import parser


def sendMail(subject, content, emails, template):
	# try:
		# raise Exception(settings.MAIL_FROM)
	message = get_template(template).render({'otp': content})
	mail = EmailMessage(
		subject=subject,
		body=message,
		from_email=settings.MAIL_FROM,
		to=emails,
		# reply_to=['prashant@six30labs.io'],
	)
	mail.content_subtype = "html"
	mail.send()
		# res = send_mail(subject, content, settings.MAIL_FROM, emails)
	# except:
	# 	return False
	# return True

def createOtp(user):
	otp_count = Otp.objects.filter(user_id=user.id, status='n')
	# raise Exception(timezone.now())
	if otp_count.count() > 0:
		last_otp = Otp.objects.filter(user_id=user.id, status='n').order_by('-id').first()
		if last_otp != None:
			time_diff = (timezone.now()-parser.parse(last_otp.time)).total_seconds()
			if  time_diff <= 60:
				return 'time_diff_error' 
		otp_count1 = Otp.objects.all().filter(user_id=user.id, status='n').update(status='d')

	# number = random.randint(1000,9999)
	number = 1234
	try:
		otp = Otp.objects.create(otp_type='login', otp=number, status='n', time=timezone.now(), user_id=user.id)
		otp.save()
		# raise Exception({otp})
	except:
		return False
	return number

def verificationOfOtp(user, otp):
	otp_count = Otp.objects.filter(user_id=user.id, status='n', otp=otp)
	# raise Exception({otp_count})
	if otp_count.count() > 0:
		try:
			last_otp = Otp.objects.filter(user_id=user.id, status='n', otp=otp).order_by('-id').first()
			if last_otp != None:
				time_diff = (timezone.now()-parser.parse(last_otp.time)).total_seconds()
				if  time_diff > 180:
					return 'time_diff_error'
		except:
			return False

		Otp.objects.all().filter(user_id=user.id, status='n', otp=otp).update(status='v', veified_at=timezone.now())
		return True
	return False

def createUser(email):
	if email.split('@')[1] == 'hapsmiths.com':
		return True
	try:
		user = User.objects.create(email=email)
		user.save()
	except:
		return False
	return True

def CreateNotification(noti_type, related_id, from_user_id, to_user_id, status, noti_text, category_id=None):
	try:
		noti = Notifications.objects.create(noti_type=noti_type, related_id=related_id, from_user_id=from_user_id, user_id=to_user_id, status=status, noti_text=noti_text, category_id=category_id)
		noti.save()
	except:
		return True
	return True

def CreateZoomLink(date, slot):
	API_KEY = 'W6fcanwBQQ-S9SQSVMDHLQ'
	API_SEC = 'EiQd3Y0Q00ZstlyNmrqAbuuFXqM6DAH9sWXe'
	token = jwt.encode(
		# Create a payload of the token containing
		# API Key & expiration time
		{'iss': API_KEY, 'exp': time() + 5000},
		# Secret used to generate token signature
		API_SEC,
		# Specify the hashing alg
		algorithm='HS256'
	)
	token = token.decode('utf-8')
	meetingdetails = {
		"topic": "Livup Session",
        "type": 2,
        "start_time": "2022-09-11T10: 14: 7",
        "duration": "45",
        "timezone": "Europe/Madrid",
        "agenda": "test",
        # "recurrence": {
        #     "type": 1,
        #     "repeat_interval": 1
        # },
        "settings": {
        	"alternative_hosts":"prashant+1@six30labs.io",
          	"host_video": "true",
           	"participant_video": "true",
           	"join_before_host": "true",
           	"mute_upon_entry": "False",
           	"watermark": "true",
           	"audio": "voip",
           	"auto_recording": "cloud"
        }
    }
	# token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXNmZjYW53QlFRLVM5U1FTVk1ESExRIiwiZXhwIjoxNjU4Mzk1NzMyLjQ2NzMzN30.pJcqy6scEdfC44HOxgH2qtrwSe09ky9KR-f0GxJkE9c'
	headers = {'authorization': 'Bearer ' + token,
			   'content-type': 'application/json'}
	r = requests.post(f'https://api.zoom.us/v2/users/me/meetings',
		headers=headers, data=json.dumps(meetingdetails))
	# converting the output into json and extracting the details
	y = json.loads(r.text)
	raise Exception(y)
	join_URL = y["join_url"]
	meetingPassword = y["password"]
	return join_URL

def MSTokenGeneration():
	# for generating the token
	# url = "https://login.microsoftonline.com/4aa11847-3bec-4b1d-a77c-dfb439df25e4/oauth2/v2.0/token"
	url = settings.URL_TOKEN_GENERATION

	payload='client_id='+settings.CLIENT_ID+'&scope='+settings.SCOPE+'&client_secret='+settings.CLIENT_SECRET+'&grant_type=client_credentials'
	headers = {
	  	'Host': 'login.microsoftonline.com',
	  	'Content-Type': 'application/x-www-form-urlencoded',
	}

	response = requests.request("POST", url, headers=headers, data=payload)
	# raise Exception(response.text)
	try:
		token = json.loads(response.text)['access_token']
	except:
		token = None
	return token

def CreateMeetingLink(date, slot, coach):
	startDateTime = date+'T'+slot+':00.0000000+05:30'
	# raise Exception(str(datetime.strptime(date+' '+slot, '%Y-%m-%d %H:%M')+timedelta(hours = 1/2)))
	if coach.coach_time_slot == '30_min':
		endDate = str(datetime.strptime(date+' '+slot, '%Y-%m-%d %H:%M')+timedelta(hours = 1/2)).split(' ')
		endDateTime = endDate[0]+'T'+endDate[1]+'.0000000+05:30'
	else:
		endDate = str(datetime.strptime(date+' '+slot, '%Y-%m-%d %H:%M')+timedelta(hours = 1)).split(' ')
		endDateTime = endDate[0]+'T'+endDate[1]+'.0000000+05:30'
	
	# for generating the token
	token = MSTokenGeneration()
	# for generating the token end
	
	if coach.coach_ms_user_id == None:
		return None
	url = "https://graph.microsoft.com/v1.0/users/"+coach.coach_ms_user_id+"/onlineMeetings"

	payload="{\n  'startDateTime':'"+startDateTime+"',\n  'endDateTime':'"+endDateTime+"',\n  'subject':'Hapsmith Therapy'\n}"
	headers = {
	  'Content-Type': 'application/json',
	  'Authorization': 'Bearer '+token
	}

	response = requests.request("POST", url, headers=headers, data=payload)
	# raise Exception(json.loads(response.text), payload)
	try:
		return json.loads(response.text)['joinUrl']
	except:
		return None
	# raise Exception(json.loads(response.text)['joinUrl'])
	# print(response.text)
	