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

from __future__ import unicode_literals
import webnotes
from webnotes import _, msgprint, throw
import json

def get_company_currency(company):
	currency = webnotes.conn.get_value("Company", company, "default_currency")
	if not currency:
		currency = webnotes.conn.get_default("currency")
	if not currency:
		throw(_('Please specify Default Currency in Company Master \
			and Global Defaults'))
		
	return currency

def get_root_of(doctype):
	"""Get root element of a DocType with a tree structure"""
	result = webnotes.conn.sql_list("""select name from `tab%s` 
		where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" % 
		(doctype, doctype))
	return result[0] if result else None
	
def get_ancestors_of(doctype, name):
	"""Get ancestor elements of a DocType with a tree structure"""
	lft, rgt = webnotes.conn.get_value(doctype, name, ["lft", "rgt"])
	result = webnotes.conn.sql_list("""select name from `tab%s` 
		where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
	return result or []

@webnotes.whitelist()
def get_price_list_currency(price_list):
	price_list_currency = webnotes.conn.get_value("Price List", {"name": price_list, 
		"enabled": 1}, "currency")

	if not price_list_currency:
		throw("{message}: {price_list} {disabled}".format(**{
			"message": _("Price List"),
			"price_list": price_list,
			"disabled": _("is disabled.")
		}))
	else:
		return {"price_list_currency": price_list_currency}