from appservices.common.util import *

payment_links = Blueprint("payment_links",__name__)

@payment_links.route("/create_payment_link",methods=["POST"])
@user_required
def create_payment_link():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	email = request.json.get("email","")
	mobileNumber = request.json.get("mobileNumber","")
	amount = request.json.get("amount",0)
	paymentPurpose = request.json.get("paymentPurpose","")
	linkExpDate = request.json.get("linkExpDate","")
	linkStatus = request.json.get("linkStatus","")

	try:
		if userId and email and amount and mobileNumber and linkExpDate:
			payment_link_table = PaymentLinks(
				userId=userId,
				email=email,
				mobileNumber=mobileNumber,
				amount=amount,
				paymentPurpose=paymentPurpose,
				linkExpDate=linkExpDate,
				linkStatus=linkStatus,
				createdOn=datetime.datetime.now(),
				status=1
				)
			save_table=payment_link_table.save()
			paymentLinkId = str(save_table.id)

			str2hash = userId+paymentLinkId
			result = hashlib.md5(str2hash.encode())
			convertMd5String = result.hexdigest()

			save_table.update(paymentLink=convertMd5String)

			data_status["responseStatus"]=1
			data_status["result"]="Payment link generated 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 create payment link!!"
		return data_status

@payment_links.route("/update_payment_link",methods=["POST"])
@user_required
def update_payment_link():
	data_status = {"responseStatus":0,"result":""}
	paymentLinkId = request.json.get("paymentLinkId","")
	userId = request.json.get("userId","")
	email = request.json.get("email","")
	mobileNumber = request.json.get("mobileNumber","")
	amount = request.json.get("amount",0)
	paymentPurpose = request.json.get("paymentPurpose","")
	linkExpDate = request.json.get("linkExpDate","")
	linkStatus = request.json.get("linkStatus","")

	try:
		if paymentLinkId and userId and email and amount and mobileNumber and linkExpDate:
			payment_link_queryset = PaymentLinks.objects(id=paymentLinkId,userId=userId,status__in=[1]).first()
			if not payment_link_queryset:
				data_status["result"]="Invaild payment link id!!"
				return data_status

			payment_link_queryset.update(
				email=email,
				mobileNumber=mobileNumber,
				amount=amount,
				paymentPurpose=paymentPurpose,
				linkExpDate=linkExpDate,
				linkStatus=linkStatus
				)

			data_status["responseStatus"]=1
			data_status["result"]="Payment link 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 payment link!!"
		return data_status

@payment_links.route("/activate_or_deactivate_payment_link_status",methods=["POST"])
@user_required
def activate_or_deactivate_payment_link_status():
	data_status = {"responseStatus":0,"result":""}
	paymentLinkId = request.json.get("paymentLinkId","")
	userId = request.json.get("userId","")

	try:
		if paymentLinkId and userId:
			payment_link_queryset = PaymentLinks.objects(id=paymentLinkId,userId=userId,status__in=[0,1]).first()
			if not payment_link_queryset:
				data_status["result"]="Invaild payment link id!!"
				return data_status

			if payment_link_queryset.status == 0:
				payment_link_queryset.update(status=1)
				data_status["result"]="Payment link status activated successfully!"
			elif payment_link_queryset.status == 1:
				payment_link_queryset.update(status=0)
				data_status["result"]="Payment link 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 payment link status!!"
		return data_status

@payment_links.route("/delete_payment_link",methods=["POST"])
@user_required
def delete_payment_link():
	data_status = {"responseStatus":0,"result":""}
	paymentLinkId = request.json.get("paymentLinkId","")
	userId = request.json.get("userId","")

	try:
		if paymentLinkId and userId:
			payment_link_queryset = PaymentLinks.objects(id=paymentLinkId,userId=userId,status__in=[0,1]).first()
			if not payment_link_queryset:
				data_status["result"]="Invaild payment link id!!"
				return data_status
			payment_link_queryset.update(status=2)

			data_status["responseStatus"]=1
			data_status["result"]="Payment link 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 payment link!!"
		return data_status

@payment_links.route("/single_view_payment_link",methods=["POST"])
@user_required
def single_view_payment_link():
	data_status = {"responseStatus":0,"result":""}
	paymentLinkId = request.json.get("paymentLinkId","")
	userId = request.json.get("userId","")

	try:
		if paymentLinkId and userId:
			payment_link_queryset = PaymentLinks.objects(id=paymentLinkId,userId=userId,status__in=[0,1]).first()
			if not payment_link_queryset:
				data_status["result"]="Invaild payment link id!!"
				return data_status

			data_status["responseStatus"]=1
			data_status["result"]="Payment link fetched data successfully!"
			data_status["paymentLinkDetails"]=fetching_payment_link_details(payment_link_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 payment link!!"
		return data_status

@payment_links.route("/view_all_payment_links",methods=["POST"])
@user_required
def view_all_payment_links():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	startDate = request.json.get("startDate","")
	endDate = request.json.get("endDate","")
	paymentLink = request.json.get("paymentLink","")
	selectFilter = request.json.get("selectFilter","")
	paymentLinksList=[]
	try:
		if not selectFilter:
			data_status["result"]="Select filter is required!!"
			return data_status

		currentDate = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
		try:
			if startDate and endDate:
				start_date = startDate + " 00:00:00"
				end_date = endDate + " 23:59:59"
				
				startDate = datetime.datetime.strptime(start_date, "%d-%m-%Y %H:%M:%S")
				endDate = datetime.datetime.strptime(end_date, "%d-%m-%Y %H:%M:%S")
			else:
				startDate = None
				endDate = None
		except Exception as e:
			app.logger.error(traceback.format_exc())
			data_status["result"] = "Invalid date format!!"
			return data_status

		payment_links_queryset = PaymentLinks.objects(userId=userId).order_by("-id").all()

		if selectFilter == "All" and (startDate or endDate or paymentLink):
			filterQuery = Q(status__in=[0, 1])
			if startDate and endDate:
				filterQuery &= Q(createdOn__gte=startDate, createdOn__lte=endDate)
			if paymentLink:
				filterQuery |= Q(paymentLink=paymentLink)
			payment_links_queryset = payment_links_queryset.filter(filterQuery)

		elif selectFilter == "Active" and (startDate or endDate or paymentLink):
			filterQuery = Q(status=1)
			if startDate and endDate:
				filterQuery &= Q(createdOn__gte=startDate, createdOn__lte=endDate)
			if paymentLink:
				filterQuery |= Q(paymentLink=paymentLink)
			payment_links_queryset = payment_links_queryset.filter(filterQuery)

		elif selectFilter == "Deactive" and (startDate or endDate or paymentLink):
			filterQuery = Q(status=0)
			if startDate and endDate:
				filterQuery &= Q(createdOn__gte=startDate, createdOn__lte=endDate)
			if paymentLink:
				filterQuery |= Q(paymentLink=paymentLink)
			payment_links_queryset = payment_links_queryset.filter(filterQuery)

		elif selectFilter == "Expired" and (startDate or endDate or paymentLink):
			filterQuery = Q(status__in=[0, 1])
			if startDate and endDate:
				filterQuery &= Q(createdOn__gte=startDate, createdOn__lte=endDate)
			if paymentLink:
				filterQuery |= Q(paymentLink=paymentLink)
			filterQuery |= Q(linkExpDate__lte=currentDate)
			payment_links_queryset = payment_links_queryset.filter(filterQuery)

		elif selectFilter in ["All", "Active", "Deactive", "Expired"] and paymentLink:
			payment_links_queryset = payment_links_queryset.filter(Q(paymentLink=paymentLink))

		for each_payment_link in payment_links_queryset:
			linkExpDate = each_payment_link.linkExpDate
			paymentLinkDict = fetching_payment_link_details(each_payment_link)
			paymentLinksList.append(paymentLinkDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Payment links fetched data successfully!"
		data_status["paymentLinksList"] = paymentLinksList
		data_status["totalPaymentsLinksCount"] = payment_links_queryset.count()
		data_status["totalRevenue"] = 0  # Calculate this if necessary
		data_status["activeLinks"] = payment_links_queryset.filter(status=1).count()
		data_status["expiredLinks"] = payment_links_queryset.filter(linkExpDate__lte=currentDate).count()
		data_status["deActiveLinks"] = payment_links_queryset.filter(status=0).count()
		data_status["usedLinks"] = 0  # Calculate this if necessary
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch payment links data!!"
		return data_status
		