# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import inspect

import frappe

from erpnext.hooks import regional_overrides

__version__ = '13.9.0'

def get_default_company(user=None):
	'''Get default company for user'''
	from frappe.defaults import get_user_default_as_list

	if not user:
		user = frappe.session.user

	companies = get_user_default_as_list(user, 'company')
	if companies:
		default_company = companies[0]
	else:
		default_company = frappe.db.get_single_value('Global Defaults', 'default_company')

	return default_company


def get_default_currency():
	'''Returns the currency of the default company'''
	company = get_default_company()
	if company:
		return frappe.get_cached_value('Company',  company,  'default_currency')

def get_default_cost_center(company):
	'''Returns the default cost center of the company'''
	if not company:
		return None

	if not frappe.flags.company_cost_center:
		frappe.flags.company_cost_center = {}
	if not company in frappe.flags.company_cost_center:
		frappe.flags.company_cost_center[company] = frappe.get_cached_value('Company',  company,  'cost_center')
	return frappe.flags.company_cost_center[company]

def get_company_currency(company):
	'''Returns the default company currency'''
	if not frappe.flags.company_currency:
		frappe.flags.company_currency = {}
	if not company in frappe.flags.company_currency:
		frappe.flags.company_currency[company] = frappe.db.get_value('Company',  company,  'default_currency', cache=True)
	return frappe.flags.company_currency[company]

def set_perpetual_inventory(enable=1, company=None):
	if not company:
		company = "_Test Company" if frappe.flags.in_test else get_default_company()

	company = frappe.get_doc("Company", company)
	company.enable_perpetual_inventory = enable
	company.save()

def encode_company_abbr(name, company):
	'''Returns name encoded with company abbreviation'''
	company_abbr = frappe.get_cached_value('Company',  company,  "abbr")
	parts = name.rsplit(" - ", 1)

	if parts[-1].lower() != company_abbr.lower():
		parts.append(company_abbr)

	return " - ".join(parts)

def is_perpetual_inventory_enabled(company):
	if not company:
		company = "_Test Company" if frappe.flags.in_test else get_default_company()

	if not hasattr(frappe.local, 'enable_perpetual_inventory'):
		frappe.local.enable_perpetual_inventory = {}

	if not company in frappe.local.enable_perpetual_inventory:
		frappe.local.enable_perpetual_inventory[company] = frappe.get_cached_value('Company',
			company,  "enable_perpetual_inventory") or 0

	return frappe.local.enable_perpetual_inventory[company]

def get_default_finance_book(company=None):
	if not company:
		company = get_default_company()

	if not hasattr(frappe.local, 'default_finance_book'):
		frappe.local.default_finance_book = {}

	if not company in frappe.local.default_finance_book:
		frappe.local.default_finance_book[company] = frappe.get_cached_value('Company',
			company,  "default_finance_book")

	return frappe.local.default_finance_book[company]

def get_party_account_type(party_type):
	if not hasattr(frappe.local, 'party_account_types'):
		frappe.local.party_account_types = {}

	if not party_type in frappe.local.party_account_types:
		frappe.local.party_account_types[party_type] = frappe.db.get_value("Party Type",
			party_type, "account_type") or ''

	return frappe.local.party_account_types[party_type]

def get_region(company=None):
	'''Return the default country based on flag, company or global settings

	You can also set global company flag in `frappe.flags.company`
	'''
	if company or frappe.flags.company:
		return frappe.get_cached_value('Company',
			company or frappe.flags.company, 'country')
	elif frappe.flags.country:
		return frappe.flags.country
	else:
		return frappe.get_system_settings('country')

def allow_regional(fn):
	'''Decorator to make a function regionally overridable

	Example:
	@erpnext.allow_regional
	def myfunction():
	  pass'''
	def caller(*args, **kwargs):
		region = get_region()
		fn_name = inspect.getmodule(fn).__name__ + '.' + fn.__name__
		if region in regional_overrides and fn_name in regional_overrides[region]:
			return frappe.get_attr(regional_overrides[region][fn_name])(*args, **kwargs)
		else:
			return fn(*args, **kwargs)

	return caller

def get_last_membership(member):
	'''Returns last membership if exists'''
	last_membership = frappe.get_all('Membership', 'name,to_date,membership_type',
		dict(member=member, paid=1), order_by='to_date desc', limit=1)

	if last_membership:
		return last_membership[0]
