# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
# License: GNU General Public License v3. See license.txt

from __future__ import unicode_literals
import webnotes

for_doctype = {
	"Support Ticket": {"status":"Open"},
	"Customer Issue": {"status":"Open"},
	"Task": {"status":"Open"},
	"Lead": {"status":"Open"},
	"Contact": {"status":"Open"},
	"Opportunity": {"docstatus":0},
	"Quotation": {"docstatus":0},
	"Sales Order": {"docstatus":0},
	"Journal Voucher": {"docstatus":0},
	"Sales Invoice": {"docstatus":0},
	"Purchase Invoice": {"docstatus":0},
	"Leave Application": {"status":"Open"},
	"Expense Claim": {"approval_status":"Draft"},
	"Job Applicant": {"status":"Open"},
	"Purchase Receipt": {"docstatus":0},
	"Delivery Note": {"docstatus":0},
	"Stock Entry": {"docstatus":0},
	"Material Request": {"docstatus":0},
	"Purchase Order": {"docstatus":0},
	"Production Order": {"docstatus":0},
	"BOM": {"docstatus":0},
	"Timesheet": {"docstatus":0},
	"Time Log": {"status":"Draft"},
	"Time Log Batch": {"status":"Draft"},
}

def get_things_todo():
	"""Returns a count of incomplete todos"""
	incomplete_todos = webnotes.conn.sql("""\
		SELECT COUNT(*) FROM `tabToDo`
		WHERE IFNULL(checked, 0) = 0
		AND (owner = %s or assigned_by=%s)""", (webnotes.session.user, webnotes.session.user))
	return incomplete_todos[0][0]

def get_todays_events():
	"""Returns a count of todays events in calendar"""
	from core.doctype.event.event import get_events
	from webnotes.utils import nowdate
	today = nowdate()
	return len(get_events(today, today))

def get_unread_messages():
	"returns unread (docstatus-0 messages for a user)"
	return webnotes.conn.sql("""\
		SELECT count(*)
		FROM `tabComment`
		WHERE comment_doctype IN ('My Company', 'Message')
		AND comment_docname = %s
		AND ifnull(docstatus,0)=0
		""", webnotes.user.name)[0][0]

for_module = {
	"To Do": get_things_todo,
	"Calendar": get_todays_events,
	"Messages": get_unread_messages
}
