import frappe
from frappe import _
from frappe.contacts.doctype.address.address import (
	Address,
	get_address_display,
	get_address_templates,
)


class ERPNextAddress(Address):
	def validate(self):
		self.validate_reference()
		self.update_company_address()

		if hasattr(super(), "validate"):
			super().validate()

	def link_address(self):
		"""Link address based on owner"""
		if self.get("is_your_company_address"):
			return

		return super().link_address()

	def update_company_address(self):
		for link in self.get("links"):
			if link.link_doctype == "Company":
				self.is_your_company_address = 1

	def validate_reference(self):
		if self.get("is_your_company_address") and not [
			row for row in self.links if row.link_doctype == "Company"
		]:
			frappe.throw(
				_(
					"Address needs to be linked to a Company. Please add a row for Company in the Links table."
				),
				title=_("Company Not Linked"),
			)

	def on_update(self):
		"""
		After Address is updated, update the related 'Primary Address' on Customer.
		"""

		if hasattr(super(), "on_update"):
			super().on_update()

		address_display = get_address_display(self.as_dict())
		customers = frappe.db.get_all(
			"Customer", filters={"customer_primary_address": self.name}, pluck="name"
		)
		for customer in customers:
			frappe.db.set_value(
				"Customer", customer, "primary_address", address_display, update_modified=False
			)


@frappe.whitelist()
def get_shipping_address(company, address=None):
	# `select`, not `read`: Delivery, Maintenance, Purchase and Stock Manager fill in forms that ask
	# for this while holding no Company `read` row. doc= so User Permissions apply to the named company.
	frappe.has_permission("Company", ptype="select", doc=company, throw=True)
	filters = [
		["Dynamic Link", "link_doctype", "=", "Company"],
		["Dynamic Link", "link_name", "=", company],
		["Address", "is_your_company_address", "=", 1],
	]
	fields = ["*"]
	if address and frappe.db.get_value("Dynamic Link", {"parent": address, "link_name": company}):
		filters.append(["Address", "name", "=", address])
	if not address:
		filters.append(["Address", "is_shipping_address", "=", 1])

	address = frappe.get_all("Address", filters=filters, fields=fields) or {}

	if address:
		address_as_dict = address[0]
		name, address_template = get_address_templates(address_as_dict)
		return address_as_dict.get("name"), frappe.render_template(
			address_template, address_as_dict, restrict_globals=True
		)
