from appservices.common.util import *

contacts = Blueprint("contacts",__name__)

@contacts.route("/create_contact",methods=["POST"])
@user_required
def create_contact():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	email = request.json.get("email","")
	mobileNumber = request.json.get("mobileNumber","")
	name = request.json.get("name","")

	try:
		if userId and email and mobileNumber and name:
			contact_table = Contacts(
				userId=userId,
				email=email,
				mobileNumber=mobileNumber,
				name=name,
				createdOn=datetime.datetime.now(),
				status=1
				)
			save_table=contact_table.save()

			data_status["responseStatus"]=1
			data_status["result"]="Contact saved successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to save contact!!"
		return data_status

@contacts.route("/update_contact",methods=["POST"])
@user_required
def update_contact():
	data_status = {"responseStatus":0,"result":""}
	contactId = request.json.get("contactId","")
	userId = request.json.get("userId","")
	email = request.json.get("email","")
	mobileNumber = request.json.get("mobileNumber","")
	name = request.json.get("name","")

	try:
		if contactId and userId:
			contact_queryset = Contacts.objects(id=contactId,userId=userId,status__in=[1]).first()
			if not contact_queryset:
				data_status["result"]="Invaild contact id!!"
				return data_status

			contact_queryset.update(
				email=email,
				mobileNumber=mobileNumber,
				name=name
				)
			data_status["responseStatus"]=1
			data_status["result"]="Contact updated successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to update contact!!"
		return data_status

@contacts.route("/activate_or_deactivate_contact_status",methods=["POST"])
@user_required
def activate_or_deactivate_contact_status():
	data_status = {"responseStatus":0,"result":""}
	contactId = request.json.get("contactId","")
	userId = request.json.get("userId","")

	try:
		if contactId and userId:
			contact_queryset = Contacts.objects(id=contactId,userId=userId,status__in=[0,1]).first()
			if not contact_queryset:
				data_status["result"]="Invaild contact id!!"
				return data_status

			if contact_queryset.status == 0:
				contact_queryset.update(status=1)
				data_status["result"]="Contact status activated successfully!"
			elif contact_queryset.status == 1:
				contact_queryset.update(status=0)
				data_status["result"]="Contact status deactivated successfully!"

			data_status["responseStatus"]=1
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to update contact status!!"
		return data_status

@contacts.route("/delete_contact",methods=["POST"])
@user_required
def delete_contact():
	data_status = {"responseStatus":0,"result":""}
	contactId = request.json.get("contactId","")
	userId = request.json.get("userId","")

	try:
		if contactId and userId:
			contact_queryset = Contacts.objects(id=contactId,userId=userId,status__in=[0,1]).first()
			if not contact_queryset:
				data_status["result"]="Invaild contact id!!"
				return data_status
			contact_queryset.update(status=2)

			data_status["responseStatus"]=1
			data_status["result"]="Contact deleted successfully!"
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to delete contact!!"
		return data_status

def fetching_contact_details(contact_queryset):
	contactDict = {}
	try:
		contactDict = {
		"id":str(contact_queryset.id),
		"userId":str(contact_queryset.userId.id),
		"userName":contact_queryset.userId.fullName,
		"createdOn":contact_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
		"email":contact_queryset.email,
		"status":contact_queryset.status,
		"mobileNumber":contact_queryset.mobileNumber,
		"name":contact_queryset.name
		}
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return contactDict

@contacts.route("/single_view_contact",methods=["POST"])
@user_required
def single_view_contact():
	data_status = {"responseStatus":0,"result":""}
	contactId = request.json.get("contactId","")
	userId = request.json.get("userId","")

	try:
		if contactId and userId:
			contact_queryset = Contacts.objects(id=contactId,userId=userId,status__in=[0,1]).first()
			if not contact_queryset:
				data_status["result"]="Invaild contact id!!"
				return data_status

			data_status["responseStatus"]=1
			data_status["result"]="Contact fetched data successfully!"
			data_status["contactDetails"]=fetching_contact_details(contact_queryset)
			return data_status
		else:
			data_status["result"]="Required fields are missing!!"
			return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch contact details!!"
		return data_status

@contacts.route("/view_all_contacts",methods=["POST"])
@user_required
def view_all_contacts():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	search_element = request.json.get("search_element","")
	contactsList=[]
	try:
		contacts_queryset = Contacts.objects(userId=userId,status__in=[0,1]).order_by("-id").all()
		if search_element:
			contacts_queryset = contacts_queryset.filter(Q(name__icontains=search_element)|Q(email__icontains=search_element))
		for each_contact in contacts_queryset:
			contactDict = fetching_contact_details(each_contact)
			contactsList.append(contactDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Contacts fetched data successfully!"
		data_status["contactsList"] = contactsList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch contacts data!!"
		return data_status