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

from __future__ import unicode_literals

import frappe, json
from frappe import _
from frappe.utils import cint, formatdate

@frappe.whitelist(allow_guest=True)
def send_message(subject="Website Query", message="", sender="", status="Open"):
	from frappe.www.contact import send_message as website_send_message
	lead = customer = None

	website_send_message(subject, message, sender)

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

	opportunity = frappe.get_doc(dict(
		doctype='Opportunity',
		enquiry_from = 'Customer' if customer else 'Lead',
		status = 'Open',
		title = subject,
		to_discuss=message
	))

	if customer:
		opportunity.customer = customer
	else:
		opportunity.lead = 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)

	return "okay"
