# Copyright (c) 2024, Your Company and contributors
# For license information, please see license.txt

import frappe
from frappe import _
from frappe.utils import flt
from taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration import (
	calculate_agricultural_tax,
	calculate_industrial_tax
)


def execute(filters=None):
	columns, data = get_columns(), get_data(filters)
	return columns, data


def get_data(filters):
	"""Получаем данные по Asset с распределением по налоговым статьям"""
	
	# Получаем Assets с учетом фильтров
	assets = get_assets(filters)
	
	if not assets:
		return []
	
	# Получаем маппинг name -> article_name из Tax Article
	tax_article_names_mapping = get_tax_article_names_mapping()
	
	# Получаем маппинг полных названий к ключам полей
	tax_articles_mapping = get_tax_articles_mapping()
	
	# Формируем данные
	data = []
	
	for asset in assets:
		row = {
			'asset': asset['name'],
			'asset_name': asset['asset_name'],
			'company': asset['company']
		}
		
		# Инициализируем все колонки нулями
		for field_key in tax_articles_mapping.values():
			row[field_key] = 0
		
		# Проверяем agricultural_tax_article
		if asset.get('agricultural_tax_article'):
			tax_article_name = asset['agricultural_tax_article']
			if tax_article_name in tax_article_names_mapping:
				full_article_name = tax_article_names_mapping[tax_article_name]
				if full_article_name in tax_articles_mapping:
					field_key = tax_articles_mapping[full_article_name]

					# ИЗМЕНЕНИЕ: Рассчитываем налог по формуле
					calculated_tax = calculate_tax_for_agricultural_asset(asset)

					# Для статьи 207.8 применяем коэффициент 75%
					if field_key == 'vm_207_8':
						calculated_tax = calculated_tax * 0.75

					row[field_key] = calculated_tax
		
		# Проверяем industrial_tax_article
		elif asset.get('industrial_tax_article'):
			tax_article_name = asset['industrial_tax_article']
			if tax_article_name in tax_article_names_mapping:
				full_article_name = tax_article_names_mapping[tax_article_name]
				if full_article_name in tax_articles_mapping:
					field_key = tax_articles_mapping[full_article_name]

					# ИЗМЕНЕНИЕ: Рассчитываем налог по формуле
					calculated_tax = calculate_tax_for_industrial_asset(asset)

					# Для статьи 207.8 применяем коэффициент 75%
					if field_key == 'vm_207_8':
						calculated_tax = calculated_tax * 0.75

					row[field_key] = calculated_tax
		
		# Добавляем строку только если есть tax_article
		if asset.get('agricultural_tax_article') or asset.get('industrial_tax_article'):
			data.append(row)
	
	return data


def get_tax_article_names_mapping():
	"""Получает маппинг name -> article_name из таблицы Tax Article"""
	tax_articles = frappe.db.sql("""
		SELECT name, article_name
		FROM `tabTax Article`
		WHERE article_name IS NOT NULL AND article_name != ''
	""", as_dict=True)
	
	return {article['name']: article['article_name'] for article in tax_articles}


def get_assets(filters):
	"""Получает Assets с учетом фильтров"""
	
	conditions = []
	values = []
	
	# Фильтр по компании
	if filters.get("company"):
		conditions.append("company = %s")
		values.append(filters.get("company"))
	
	# Только submitted статус
	conditions.append("status = 'Submitted'")
	
	# Только assets с заполненным tax_article
	conditions.append("(agricultural_tax_article IS NOT NULL AND agricultural_tax_article != '' OR industrial_tax_article IS NOT NULL AND industrial_tax_article != '')")
	
	where_clause = ""
	if conditions:
		where_clause = "WHERE " + " AND ".join(conditions)
	
	query = f"""
		SELECT
			name,
			asset_name,
			company,
			agricultural_tax_article,
			industrial_tax_article,
			total_asset_cost,
			agricultural_purpose,
			cadastral_district_name,
			cadastral_district_code,
			quality_groups,
			agricultural_land_purpose,
			territorial_unit_name,
			territorial_unit_code,
			industrial_land_purpose,
			mining_note,
			tax_exempt_area,
			area
		FROM
			`tabAsset`
		{where_clause}
		ORDER BY
			name
	"""
	
	return frappe.db.sql(query, values, as_dict=True)


def get_tax_articles_mapping():
	"""Маппинг налоговых статей для Land Tax к полям"""
	return {
		"Vergi Məcəlləsinin 207.3-cü maddəsinə əsasən Sənaye, yaxud texnologiyalar parklarının rezidenti olan hüquqi şəxsin sənaye, yaxud texnologiyalar parklarında istifadə etdikləri torpaqlara görə": "vm_207_3",
		"Vergi Məcəlləsinin 207.4-cü maddəsinə əsasən Sənaye, yaxud texnologiyalar parklarının idarəedici təşkilatı və ya operatorunun sənaye, yaxud texnologiyalar parklarının ərazisində istifadə etdiyi torpaqlara görə": "vm_207_4",
		"Vergi Məcəlləsinin 207.5-ci maddəsinə əsasən İnvestisiya təşviqi sənədini almış hüquqi şəxs həmin sənədi aldığı tarixdən mülkiyyətində və ya istifadəsində olan müvafiq torpaqlara görə": "vm_207_5",
		"Vergi Məcəlləsinin 207.6-cı maddəsinə əsasən KOB klaster şirkətləri KOB klaster şirkətlərinin reyestrinə daxil edildiyi tarixdən 7 il müddətinə mülkiyyətində və ya istifadəsində olan torpaqlara görə": "vm_207_6",
		"Vergi Məcəlləsinin 207.7-ci maddəsinə əsasən \"Aqrarkredit\" Qapalı Səhmdar Cəmiyyəti Bank Olmayan Kredit Təşkilatı və \"Azərbaycan Sənaye Korporasiyası\" Açıq Səhmdar Cəmiyyəti ödəmə qabiliyyətini itirmiş bankların rezolyusiyası və sağlamlaşdırma tədbirləri çərçivəsində Azərbaycan Respublikasının Prezidentinin qərarına əsasən aldığı problemli aktivlərin (borcların) əvəzində əldə etdiyi, onun mülkiyyətində (balansında) olan və siyahısını Azərbaycan Respublikasının İqtisadiyyat Nazirliyi ilə razılaşdırdığı torpağa görə": "vm_207_7",
		"Vergi Məcəlləsinin 207.8-ci maddəsinə əsasən Geoloji ayırma sənədi əsasında faydalı qazıntı yataqlarının (neft və qaz yataqları istisna olmaqla) axtarışı, qiymətləndirilməsi və kəşfiyyatı işlərinə cəlb edilən torpaq sahələrinə görə torpaq vergisi müvafiq təsdiqedici sənədlər (geoloji-kəşfiyyat işlərini həyata keçirən şəxsin podrat müqaviləsi, geoloji-kəşfiyyat planı, geoloji-kəşfiyyatla bağlı təqdim edilən hesabat) əsasında faydalı qazıntı yataqlarının axtarışı, qiymətləndirilməsi və kəşfiyyatı işlərinə başlanıldığı təqvim ili üzrə 75 faiz": "vm_207_8",
		"Vergi Məcəlləsinin 207.9-cu maddəsinə əsasən Vergi Məcəlləsinin 207.9-cu maddəsinə əsasən Kredit təşkilatları məhkəmənin qanuni qüvvəyə minmiş qərarına əsasən müflis elan olunduğu halda kredit təşkilatının müflis elan olunması ilə bağlı məhkəmə qərarının qüvvəyə mindiyi ildən etibarən torpaq vergisini ödəməkdən azaddırlar": "vm_207_9",
		"Vergi Məcəlləsinin 207.10-cu maddəsinə əsasən Siyahısı Azərbaycan Respublikasının Nazirlər Kabineti tərəfindən təsdiq edilmiş idxal mallarını yerli istehsal (emal) malları ilə əvəz edəcək qida (ərzaq) məhsullarının istehsalı ilə məşğul olan hüquqi və fiziki şəxslər həmin fəaliyyət prosesində istifadə olunan torpaqlara görə müvafiq siyahının təsdiq edildiyi ildən etibarən 7 il müddətinə torpaq vergisini ödəməkdən azaddırlar": "vm_207_10",
		"Vergi Məcəlləsinin 207.11-ci maddəsinə əsasən Azərbaycan Respublikasında dövlət əmlakının özəlləşdirilməsinin dövlət proqramlarına uyğun olaraq 2023-cü il 1 yanvar tarixindən sonra özəlləşdirilməsi barədə qərar qəbul edilən dövlətə məxsus hüquqi şəxslər özəlləşdirilməsi barədə qərarın qəbul edildiyi ildən etibarən özəlləşdirilmə prosesi müddətində, lakin 3 ildən çox olmayaraq, torpaq vergisini ödəməkdən azaddırlar": "vm_207_11",
		"Vergi məcəlləsinin 207.12-ci maddəsinə əsasən Kredit təşkilatları verilmiş kredit müqabilində onların mülkiyyətinə keçən torpaqlara görə": "vm_207_12",
		"Vergi Məcəlləsinin 227.1-ci maddəsinə əsasən": "vm_227_1"
	}


def get_field_to_label_mapping():
	"""Маппинг ключей полей к коротким названиям колонок"""
	return {
		"vm_207_3": "VM 207.3",
		"vm_207_4": "VM 207.4",
		"vm_207_5": "VM 207.5",
		"vm_207_6": "VM 207.6",
		"vm_207_7": "VM 207.7",
		"vm_207_8": "VM 207.8",
		"vm_207_9": "VM 207.9",
		"vm_207_10": "VM 207.10",
		"vm_207_11": "VM 207.11",
		"vm_207_12": "VM 207.12",
		"vm_227_1": "VM 227.1"
	}


def get_columns():
	"""Создает колонки отчета"""
	columns = []

	# Основные колонки
	columns.extend([
		{
			"label": "Asset",
			"fieldname": "asset",
			"fieldtype": "Link",
			"options": "Asset",
			"width": 150
		},
		{
			"label": "Asset Name",
			"fieldname": "asset_name",
			"fieldtype": "Data",
			"width": 200
		}
	])

	# Получаем маппинг полей к названиям
	field_to_label = get_field_to_label_mapping()

	# Создаем колонки для каждого поля в правильном порядке
	for field_key in sorted(field_to_label.keys()):
		label = field_to_label[field_key]
		columns.append({
			"label": label,
			"fieldname": field_key,
			"fieldtype": "Currency",
			"width": 120
		})

	return columns


def calculate_tax_for_agricultural_asset(asset):
	"""Рассчитывает налог для сельскохозяйственной земли"""
	try:
		# Определяем agricultural_purpose_name
		agricultural_purpose_name = get_agricultural_purpose_name(asset.get('agricultural_purpose'))

		# Рассчитываем налогооблагаемую площадь
		taxable_area = calculate_taxable_area(asset.get('area'), asset.get('tax_exempt_area'))

		# Если вся площадь освобождена от налогов, возвращаем 0
		if taxable_area <= 0:
			return 0

		# Вызываем функцию расчета из land_tax_declaration
		result = calculate_agricultural_tax(
			area_value=taxable_area,
			cadastral_district_name=asset.get('cadastral_district_name'),
			quality_groups=asset.get('quality_groups'),
			agricultural_land_purpose=asset.get('agricultural_land_purpose'),
			agricultural_purpose_name=agricultural_purpose_name
		)

		return result.get('tax_amount', 0) if isinstance(result, dict) else 0
	except Exception as e:
		frappe.log_error(f"Error calculating agricultural tax for asset {asset.get('name')}: {str(e)}")
		return 0


def calculate_tax_for_industrial_asset(asset):
	"""Рассчитывает налог для промышленной земли"""
	try:
		# Рассчитываем налогооблагаемую площадь
		taxable_area = calculate_taxable_area(asset.get('area'), asset.get('tax_exempt_area'))

		# Если вся площадь освобождена от налогов, возвращаем 0
		if taxable_area <= 0:
			return 0

		# Вызываем функцию расчета из land_tax_declaration
		result = calculate_industrial_tax(
			area_sqm=taxable_area,
			territorial_unit_name=asset.get('territorial_unit_name'),
			industrial_land_purpose=asset.get('industrial_land_purpose')
		)

		return result.get('tax_amount', 0) if isinstance(result, dict) else 0
	except Exception as e:
		frappe.log_error(f"Error calculating industrial tax for asset {asset.get('name')}: {str(e)}")
		return 0


def get_agricultural_purpose_name(agricultural_purpose_id):
	"""Получает название agricultural purpose по ID"""
	if not agricultural_purpose_id:
		return None

	try:
		purpose_doc = frappe.get_doc('Agricultural Purpose Type', agricultural_purpose_id)
		return purpose_doc.purpose_name
	except:
		return None


def calculate_taxable_area(total_area, tax_exempt_area):
	"""
	Рассчитывает налогооблагаемую площадь, вычитая освобожденную от налогов площадь.

	Args:
		total_area: Общая площадь (float)
		tax_exempt_area: Освобожденная от налогов площадь (строка или число)

	Returns:
		float: Налогооблагаемая площадь (total_area - tax_exempt_area)
	"""
	# Если общая площадь не указана, возвращаем 0
	if not total_area:
		return 0

	total_area_float = flt(total_area)

	# Если нет освобожденной площади, возвращаем полную площадь
	if not tax_exempt_area:
		return total_area_float

	# Преобразуем tax_exempt_area в число (может быть строкой)
	try:
		exempt_area_float = flt(tax_exempt_area)
	except (ValueError, TypeError):
		# Если не удалось преобразовать, игнорируем освобожденную площадь
		frappe.log_error(f"Invalid tax_exempt_area value: {tax_exempt_area}. Using full area for tax calculation.")
		return total_area_float

	# Рассчитываем налогооблагаемую площадь
	taxable_area = total_area_float - exempt_area_float

	# Возвращаем 0, если результат отрицательный
	return max(0, taxable_area)