# Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt


import frappe
from frappe import _
from frappe.utils.bot import BotParser


class FindItemBot(BotParser):
	def get_reply(self):
		if self.startswith('where is', 'find item', 'locate'):
			if not frappe.has_permission('Warehouse'):
				raise frappe.PermissionError

			item = '%{0}%'.format(self.strip_words(self.query, 'where is', 'find item', 'locate'))
			items = frappe.db.sql('''select name from `tabItem` where item_code like %(txt)s
				or item_name like %(txt)s or description like %(txt)s''', dict(txt=item))

			if items:
				out = []
				warehouses = frappe.get_all("Warehouse")
				for item in items:
					found = False
					for warehouse in warehouses:
						qty = frappe.db.get_value("Bin", {'item_code': item[0], 'warehouse': warehouse.name}, 'actual_qty')
						if qty:
							out.append(_('{0} units of [{1}](/app/Form/Item/{1}) found in [{2}](/app/Form/Warehouse/{2})').format(qty,
								item[0], warehouse.name))
							found = True

					if not found:
						out.append(_('[{0}](/app/Form/Item/{0}) is out of stock').format(item[0]))

				return "\n\n".join(out)

			else:
				return _("Did not find any item called {0}").format(item)
