from appservices.common.util import *

settings = Blueprint("settings",__name__)

@settings.route("/create_customer_care",methods=["POST"])
@user_required
def create_customer_care():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	email = request.json.get("email")
	helpNumber = request.json.get("helpNumber")
	address = request.json.get("address")

	try:
		if email and helpNumber and address:
			customer_care_queryset = CustomerCare.objects(userId=userId,status__in=[0,1]).first()
			if customer_care_queryset:
				customer_care_queryset.update(
					email=email,
					helpNumber=helpNumber,
					address=address
					)
				data_status["result"]="Customer care details updated successfully!"
			else:
				customer_care_table = CustomerCare(
					userId=userId,
					email=email,
					helpNumber=helpNumber,
					address=address,
					createdOn=datetime.datetime.now(),
					status=1
					)
				save_table=customer_care_table.save()
				customerCareId = str(save_table.id)
				data_status["result"]="Customer care added 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 create customer care details!!"
		return data_status

def fetching_customer_care_details(customer_care_queryset):
	customerCareDict = {}
	try:
		if customer_care_queryset:
			customerCareDict = {
			"id":str(customer_care_queryset.id),
			"userId":str(customer_care_queryset.userId.id),
			"userName":customer_care_queryset.userId.fullName,
			"createdOn":customer_care_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
			"status":customer_care_queryset.status,
			"email":customer_care_queryset.email,
			"helpNumber":customer_care_queryset.helpNumber,
			"address":customer_care_queryset.address
			}
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return customerCareDict

@settings.route("/view_customer_care",methods=["POST"])
@user_required
def view_customer_care():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")

	try:
		customer_care_queryset = CustomerCare.objects(userId=userId,status__in=[0,1]).first()

		data_status["responseStatus"]=1
		data_status["result"]="Customer care details fetched successfully!"
		data_status["customerCareDetails"]=fetching_customer_care_details(customer_care_queryset)
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch customer care details!!"
		return data_status

######################################### Webhooks API's Here #########################################
@settings.route("/create_webhook",methods=["POST"])
@user_required
def create_webhook():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	webhookType = request.json.get("webhookType","")
	webhookLink = request.json.get("webhookLink","")
	webhookStatus = request.json.get("webhookStatus")

	try:
		if userId and webhookType and webhookLink and webhookStatus:
			webhook_table = WebHooks(
				userId=userId,
				webhookType=webhookType,
				webhookLink=webhookLink,
				webhookStatus=webhookStatus,
				createdOn=datetime.datetime.now(),
				status=1
				)
			save_table=webhook_table.save()

			data_status["responseStatus"]=1
			data_status["result"]="Webhook created 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 webhook!!"
		return data_status

@settings.route("/update_webhook",methods=["POST"])
@user_required
def update_webhook():
	data_status = {"responseStatus":0,"result":""}
	webhookId = request.json.get("webhookId","")
	userId = request.json.get("userId","")
	webhookType = request.json.get("webhookType","")
	webhookLink = request.json.get("webhookLink","")
	webhookStatus = request.json.get("webhookStatus")

	try:
		if webhookId and userId:
			webhook_queryset = WebHooks.objects(id=webhookId,userId=userId,status__in=[1]).first()
			if not webhook_queryset:
				data_status["result"]="Invaild webhook id!!"
				return data_status

			webhook_queryset.update(
				webhookType=webhookType,
				webhookLink=webhookLink,
				webhookStatus=webhookStatus,
				updatedOn=datetime.datetime.now()
				)
			data_status["responseStatus"]=1
			data_status["result"]="Webhook 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 webhook!!"
		return data_status

@settings.route("/activate_or_deactivate_webhook_status",methods=["POST"])
@user_required
def activate_or_deactivate_webhook_status():
	data_status = {"responseStatus":0,"result":""}
	webhookId = request.json.get("webhookId","")
	userId = request.json.get("userId","")

	try:
		if webhookId and userId:
			webhook_queryset = WebHooks.objects(id=webhookId,userId=userId,status__in=[0,1]).first()
			if not webhook_queryset:
				data_status["result"]="Invaild webhook id!!"
				return data_status

			if webhook_queryset.status == 0:
				webhook_queryset.update(status=1)
				data_status["result"]="Webhook status activated successfully!"
			elif webhook_queryset.status == 1:
				webhook_queryset.update(status=0)
				data_status["result"]="Webhook 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 webhook status!!"
		return data_status

@settings.route("/delete_webhook",methods=["POST"])
@user_required
def delete_webhook():
	data_status = {"responseStatus":0,"result":""}
	webhookId = request.json.get("webhookId","")
	userId = request.json.get("userId","")

	try:
		if webhookId and userId:
			webhook_queryset = WebHooks.objects(id=webhookId,userId=userId,status__in=[0,1]).first()
			if not webhook_queryset:
				data_status["result"]="Invaild webhook id!!"
				return data_status
			webhook_queryset.update(status=2)

			data_status["responseStatus"]=1
			data_status["result"]="Webhook 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 webhook!!"
		return data_status

def fetching_webhook_details(webhook_queryset):
	webhookDict = {}
	try:
		webhookDict = {
		"id":str(webhook_queryset.id),
		"userId":str(webhook_queryset.userId.id),
		"userName":webhook_queryset.userId.fullName,
		"createdOn":webhook_queryset.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p"),
		"status":webhook_queryset.status,
		"webhookType":webhook_queryset.webhookType,
		"webhookLink":webhook_queryset.webhookLink,
		"webhookStatus":webhook_queryset.webhookStatus
		}
		if webhook_queryset.updatedOn:
			webhookDict["updatedOn"]=webhook_queryset.updatedOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
		else:
			webhookDict["updatedOn"]=""
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return webhookDict

@settings.route("/single_view_webhook",methods=["POST"])
@user_required
def single_view_webhook():
	data_status = {"responseStatus":0,"result":""}
	webhookId = request.json.get("webhookId","")
	userId = request.json.get("userId","")

	try:
		if webhookId and userId:
			webhook_queryset = WebHooks.objects(id=webhookId,userId=userId,status__in=[0,1]).first()
			if not webhook_queryset:
				data_status["result"]="Invaild webhook id!!"
				return data_status

			data_status["responseStatus"]=1
			data_status["result"]="Webhook fetched data successfully!"
			data_status["webhookDetails"]=fetching_webhook_details(webhook_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 webhook details!!"
		return data_status

@settings.route("/view_all_webhooks",methods=["POST"])
@user_required
def view_all_webhooks():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	webhooksList=[]
	try:
		webhooks_queryset = WebHooks.objects(userId=userId,status__in=[0,1]).order_by("-id").all()
		for each_webhook in webhooks_queryset:
			webhookDict = fetching_webhook_details(each_webhook)
			webhooksList.append(webhookDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Webhooks fetched data successfully!"
		data_status["webhooksList"] = webhooksList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch webhooks data!!"
		return data_status

######################################### API's Securities Here #########################################
@settings.route("/create_api_security",methods=["POST"])
@user_required
def create_api_security():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	apiType = request.json.get("apiType","") # "payout","auto_collect","payment_gateway"
	ipAddress = request.json.get("ipAddress","")
	validFor = request.json.get("validFor","") # "one_month","one_year","always"
	ipAddressList = request.json.get("ipAddressList")

	try:
		if userId and apiType and validFor:
			token = secrets.token_hex(16)
			apiKey = userId+"-"+str(token)
			secretKey = str(secrets.token_hex(16))

			api_security_table = ApiSecurities(
				userId=userId,
				apiType=apiType,
				ipAddress=ipAddress,
				ipAddressList=ipAddressList,
				apiKey=apiKey,
				secretKey=secretKey,
				createdOn=datetime.datetime.now(),
				status=1
				)
			save_table=api_security_table.save()

			# Get the current date and time
			current_date = datetime.datetime.now()

			if validFor == "one_month":
				# Add one month to the current date and time
				current_date_plus_one_month = current_date + relativedelta(months=1)

				save_table.update(validFor=validFor,validStartDate=current_date,validEndDate=current_date_plus_one_month)

			elif validFor == "one_year":
				# Add one year to the current date and time
				current_date_plus_one_year = current_date + relativedelta(years=1)

				save_table.update(validFor=validFor,validStartDate=current_date,validEndDate=current_date_plus_one_year)

			else:
				save_table.update(validFor=validFor,validStartDate=current_date,validEndDate=None)

			data_status["responseStatus"]=1
			data_status["result"]="API 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 generate api!!"
		return data_status

@settings.route("/update_api_security",methods=["POST"])
@user_required
def update_api_security():
	data_status = {"responseStatus":0,"result":""}
	apiId = request.json.get("apiId","")
	userId = request.json.get("userId","")
	apiType = request.json.get("apiType","")
	ipAddress = request.json.get("ipAddress","")
	validFor = request.json.get("validFor")
	ipAddressList = request.json.get("ipAddressList")

	try:
		if apiId and userId:
			api_security_queryset = ApiSecurities.objects(id=apiId,userId=userId,status__in=[1]).first()
			if not api_security_queryset:
				data_status["result"]="Invaild api id!!"
				return data_status

			api_security_queryset.update(
				apiType=apiType,
				ipAddress=ipAddress,
				ipAddressList=ipAddressList,
				validFor=validFor
				)
			# Get the current date and time
			current_date = datetime.datetime.now()

			if validFor == "one_month":
				# Add one month to the current date and time
				current_date_plus_one_month = current_date + relativedelta(months=1)

				api_security_queryset.update(validFor=validFor,validStartDate=current_date,validEndDate=current_date_plus_one_month)

			elif validFor == "one_year":
				# Add one year to the current date and time
				current_date_plus_one_year = current_date + relativedelta(years=1)

				api_security_queryset.update(validFor=validFor,validStartDate=current_date,validEndDate=current_date_plus_one_year)

			else:
				api_security_queryset.update(validFor=validFor,validStartDate=current_date,validEndDate=None)

			data_status["responseStatus"]=1
			data_status["result"]="API 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 api!!"
		return data_status

@settings.route("/activate_or_deactivate_api_security_status",methods=["POST"])
@user_required
def activate_or_deactivate_api_security_status():
	data_status = {"responseStatus":0,"result":""}
	apiId = request.json.get("apiId","")
	userId = request.json.get("userId","")

	try:
		if apiId and userId:
			api_security_queryset = ApiSecurities.objects(id=apiId,userId=userId,status__in=[0,1]).first()
			if not api_security_queryset:
				data_status["result"]="Invaild api id!!"
				return data_status

			if api_security_queryset.status == 0:
				api_security_queryset.update(status=1)
				data_status["result"]="API status activated successfully!"
			elif api_security_queryset.status == 1:
				api_security_queryset.update(status=0)
				data_status["result"]="API 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 api status!!"
		return data_status

@settings.route("/delete_api_security",methods=["POST"])
@user_required
def delete_api_security():
	data_status = {"responseStatus":0,"result":""}
	apiId = request.json.get("apiId","")
	userId = request.json.get("userId","")

	try:
		if apiId and userId:
			api_security_queryset = ApiSecurities.objects(id=apiId,userId=userId,status__in=[0,1]).first()
			if not api_security_queryset:
				data_status["result"]="Invaild api id!!"
				return data_status
			api_security_queryset.update(status=2)

			data_status["responseStatus"]=1
			data_status["result"]="API 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 api!!"
		return data_status

def fetching_api_security_details(api_security_queryset):
	apiDict = {}
	try:
		apiDict = {
		"id":str(api_security_queryset.id),
		"userId":str(api_security_queryset.userId.id),
		"userName":api_security_queryset.userId.fullName,
		"createdOn":api_security_queryset.createdOn.strftime("%d-%m-%Y"),
		"validStartDate":api_security_queryset.validStartDate.strftime("%d-%m-%Y"),
		"apiType":api_security_queryset.apiType,
		"ipAddress":api_security_queryset.ipAddress,
		"apiKey":api_security_queryset.apiKey,
		"secretKey":api_security_queryset.secretKey,
		"ipAddressList":api_security_queryset.ipAddressList,
		"validFor":api_security_queryset.validFor
		}
		if api_security_queryset.validEndDate:
			apiDict["validEndDate"]=api_security_queryset.validEndDate.strftime("%d-%m-%Y")
		else:
			apiDict["validEndDate"]="always"
	except Exception as e:
		app.logger.error(traceback.format_exc())
	return apiDict

@settings.route("/single_view_api_security",methods=["POST"])
@user_required
def single_view_api_security():
	data_status = {"responseStatus":0,"result":""}
	apiId = request.json.get("apiId","")
	userId = request.json.get("userId","")

	try:
		if apiId and userId:
			api_security_queryset = ApiSecurities.objects(id=apiId,userId=userId,status__in=[0,1]).first()
			if not api_security_queryset:
				data_status["result"]="Invaild api id!!"
				return data_status

			data_status["responseStatus"]=1
			data_status["result"]="API fetched data successfully!"
			data_status["apiDetails"]=fetching_api_security_details(api_security_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 api details!!"
		return data_status

@settings.route("/view_all_api_securitys",methods=["POST"])
@user_required
def view_all_api_securitys():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	apisList=[]
	try:
		api_securitys_queryset = ApiSecurities.objects(userId=userId,status__in=[0,1]).order_by("-id").all()
		for each_api_security in api_securitys_queryset:
			apiDict = fetching_api_security_details(each_api_security)
			apisList.append(apiDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "APIs fetched data successfully!"
		data_status["apisList"] = apisList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch apis data!!"
		return data_status


# @settings.route("/payout_dashboard_details",methods=["POST"])
# @user_required
# def payout_dashboard_details():
# 	data_status = {"responseStatus":0,"result":""}
# 	userId = request.json.get("userId","")
# 	payOutDashBoardDetails={}
# 	try:
# 		payouts_queryset = FundTransfers.objects(userId=userId).order_by("-id").all()
# 		totalTransactionsCount = payouts_queryset.filter(status__in=[0,1,2]).count()
# 		successTransactionsCount = payouts_queryset.filter(status__in=[1]).count()
# 		processingTransactionsCount = payouts_queryset.filter(status__in=[2]).count()
# 		FailedTransactionsCount = payouts_queryset.filter(status__in=[0]).count()

# 		payOutDashBoardDetails = {
# 		"totalTransactionsCount":totalTransactionsCount,
# 		"successTransactionsCount":successTransactionsCount,
# 		"processingTransactionsCount":processingTransactionsCount,
# 		"FailedTransactionsCount":FailedTransactionsCount,
# 		}

# 		data_status["responseStatus"] = 1
# 		data_status["result"] = "Payout dashboard details fetched successfully!"
# 		data_status["payOutDashBoardDetails"] = payOutDashBoardDetails
# 		return data_status
# 	except Exception as e:
# 		app.logger.error(traceback.format_exc())
# 		data_status["result"]="Unable to fetch payout dashboard data!!"
# 		return data_status

@settings.route("/view_all_api_document_guides",methods=["POST"])
@user_required
def view_all_api_document_guides():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	apiDocumentGuidesList=[]
	try:
		api_docs_guide_queryset = ApiDocumentGuide.objects(status__in=[1]).order_by("priority").all()
		for each_document in api_docs_guide_queryset:
			apiDocumentGuideDict = fetching_api_document_guide_details(each_document)
			apiDocumentGuidesList.append(apiDocumentGuideDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "API document guides details fetched successfully!"
		data_status["apiDocumentGuidesList"] = apiDocumentGuidesList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch api documents data!!"
		return data_status


@settings.route("/payout_fundsources_list",methods=["POST"])
@user_required
def payout_fundsources_list():
	data_status = {"responseStatus":0,"result":""}
	userId = request.json.get("userId","")
	payoutFundsourcesList=[]
	try:
		payout_fundsources_queryset = PayoutBalances.objects(userId=userId).order_by("-id").all()
		for each_payout_fund_source in payout_fundsources_queryset:
			payOutBalanceDict = {
			"transactionAPIId":str(each_payout_fund_source.transactionAPIId.id),
			"transactionAPIName":each_payout_fund_source.transactionAPIId.apiName,
			"previousBalance":formatINR("{:.2f}".format(float(each_payout_fund_source.previousBalance))),
			"currentBalance":formatINR("{:.2f}".format(float(each_payout_fund_source.currentBalance))),
			"createdOn":each_payout_fund_source.createdOn.astimezone(ist_timezone).strftime("%d-%m-%Y %I:%M %p")
			}
			payoutFundsourcesList.append(payOutBalanceDict)

		data_status["responseStatus"] = 1
		data_status["result"] = "Payout balances details fetched successfully!"
		data_status["payoutFundsourcesList"] = payoutFundsourcesList
		return data_status
	except Exception as e:
		app.logger.error(traceback.format_exc())
		data_status["result"]="Unable to fetch payout balances data!!"
		return data_status