# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt


import frappe
from frappe.rate_limiter import rate_limit
from frappe.utils import escape_html


@frappe.whitelist(allow_guest=True, methods=["POST"])
@rate_limit(limit=10, seconds=3 * 60)
def send_message(sender, message, subject="Website Query"):
	from frappe.www.contact import send_message as website_send_message

	website_send_message(sender, message, subject)

	message = escape_html(message)

	oppotunity_creation = frappe.get_single_value(
		"CRM Settings", "enable_opportunity_creation_from_contact_us"
	)

	if not oppotunity_creation:
		# Meant to silently fail instead of throwing error.
		return

	lead = customer = None
	customer = frappe.db.sql(
		"""select distinct dl.link_name from `tabDynamic Link` dl
		left join `tabContact` c on dl.parent=c.name where dl.link_doctype='Customer'
		and c.email_id = %s""",
		sender,
	)

	if not customer:
		lead = frappe.db.get_value("Lead", dict(email_id=sender))
		if not lead:
			new_lead = frappe.get_doc(
				doctype="Lead", email_id=sender, lead_name=sender.split("@")[0].title()
			).insert(ignore_permissions=True)

	opportunity = frappe.get_doc(
		doctype="Opportunity",
		opportunity_from="Customer" if customer else "Lead",
		status="Open",
		title=subject,
		contact_email=sender,
	)

	if customer:
		opportunity.party_name = customer[0][0]
	elif lead:
		opportunity.party_name = lead
	else:
		opportunity.party_name = new_lead.name

	opportunity.insert(ignore_permissions=True)

	comm = frappe.get_doc(
		{
			"doctype": "Communication",
			"subject": subject,
			"content": message,
			"sender": sender,
			"sent_or_received": "Received",
			"reference_doctype": "Opportunity",
			"reference_name": opportunity.name,
		}
	)
	comm.insert(ignore_permissions=True)
