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

frappe.query_reports["Tax Exempt Assets Report"] = {
	"filters": [
		{
			"fieldname": "company",
			"label": __("Company"),
			"fieldtype": "Link",
			"options": "Company",
			"default": frappe.defaults.get_user_default("Company"),
			"reqd": 1,
		},
		{
			"fieldname": "from_date",
			"label": __("From Date"),
			"fieldtype": "Date",
			"default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
			"reqd": 1,
		},
		{
			"fieldname": "to_date",
			"label": __("To Date"),
			"fieldtype": "Date",
			"default": frappe.datetime.get_today(),
			"reqd": 1,
		}
	],

	"formatter": function (value, row, column, data, default_formatter) {
		value = default_formatter(value, row, column, data);

		// Подсветка колонок с остатками и страховкой
		if (column.fieldname && column.fieldname.includes("value_")) {
			if (value && parseFloat(value) > 0) {
				// Разные цвета для разных типов колонок
				let color = "#28a745"; // зеленый по умолчанию
				
				if (column.fieldname.includes("_value_from")) {
					color = "#17a2b8"; // голубой для начальных остатков
				} else if (column.fieldname.includes("_value_to")) {
					color = "#28a745"; // зеленый для конечных остатков
				} else if (column.fieldname.includes("_insured")) {
					color = "#ffc107"; // желтый для страховки
				}
				
				value = `<span style="color: ${color}; font-weight: bold; background-color: ${color}15; padding: 2px 6px; border-radius: 3px;">${value}</span>`;
			} else if (value == 0 || !value) {
				value = `<span style="color: #ccc;">0.00</span>`;
			}
		}

		// Подсветка Asset колонки
		if (column.fieldname == "asset" && value) {
			value = `<span style="color: #007bff; font-weight: bold;">${value}</span>`;
		}

		// Подсветка Date колонки
		if (column.fieldname == "purchase_date" && value) {
			value = `<span style="color: #6c757d; font-weight: 500;">${value}</span>`;
		}

		return value;
	},

	"onload": function(report) {
		// Добавляем кастомные кнопки
		report.page.add_inner_button(__("Export Tax Summary"), function() {
			export_tax_summary(report);
		});

		report.page.add_inner_button(__("Show Tax Articles"), function() {
			show_tax_articles_info();
		});
	},

	"after_datatable_render": function(datatable_obj) {
		// Добавляем итоговую статистику
		setTimeout(() => {
			add_tax_statistics(datatable_obj);
		}, 500);
	}
};

// Функция экспорта сводки по налоговым статьям
function export_tax_summary(report) {
	let data = report.data;
	let summary = calculate_tax_totals(data);
	
	// Создаем CSV с итогами по налоговым статьям
	let csv_content = "Tax Article,Assets Count,Total Value From,Total Value To,Total Insured Value\n";
	
	summary.forEach(item => {
		csv_content += `"${item.article}",${item.assets_count},${item.total_value_from},${item.total_value_to},${item.total_insured}\n`;
	});
	
	// Добавляем общие итоги
	let totals = summary.reduce((acc, item) => {
		acc.total_assets += item.assets_count;
		acc.total_value_from += item.total_value_from;
		acc.total_value_to += item.total_value_to;
		acc.total_insured += item.total_insured;
		return acc;
	}, {total_assets: 0, total_value_from: 0, total_value_to: 0, total_insured: 0});
	
	csv_content += `\n"TOTAL",${totals.total_assets},${totals.total_value_from},${totals.total_value_to},${totals.total_insured}\n`;
	
	// Скачиваем файл
	let blob = new Blob([csv_content], { type: 'text/csv;charset=utf-8' });
	let url = window.URL.createObjectURL(blob);
	let a = document.createElement('a');
	a.href = url;
	a.download = 'tax_exempt_summary_' + frappe.datetime.get_today() + '.csv';
	document.body.appendChild(a);
	a.click();
	document.body.removeChild(a);
	window.URL.revokeObjectURL(url);
	
	frappe.show_alert({message: __("Tax summary exported successfully"), indicator: "green"});
}

// Функция расчета итогов по налоговым статьям
function calculate_tax_totals(data) {
	let tax_articles = get_tax_articles_list();
	let summary = [];
	
	tax_articles.forEach(article => {
		let article_key = get_field_key_js(article.full_name);
		let assets_count = 0;
		let total_value_from = 0;
		let total_value_to = 0;
		let total_insured = 0;
		
		data.forEach(row => {
			let value_from = row[`${article_key}_value_from`] || 0;
			let value_to = row[`${article_key}_value_to`] || 0;
			let insured = row[`${article_key}_insured`] || 0;
			
			if (value_from > 0 || value_to > 0 || insured > 0) {
				assets_count++;
				total_value_from += value_from;
				total_value_to += value_to;
				total_insured += insured;
			}
		});
		
		if (assets_count > 0) {
			summary.push({
				article: article.short_name,
				assets_count: assets_count,
				total_value_from: total_value_from,
				total_value_to: total_value_to,
				total_insured: total_insured
			});
		}
	});
	
	return summary;
}

// Функция показа информации о налоговых статьях
function show_tax_articles_info() {
	let tax_articles = get_tax_articles_list();
	let info_html = '<div class="tax-articles-info">';
	info_html += '<h4>📋 Налоговые статьи в отчете:</h4>';
	info_html += '<div class="row">';
	
	tax_articles.forEach((article, index) => {
		if (index % 2 === 0 && index > 0) {
			info_html += '</div><div class="row">';
		}
		
		info_html += '<div class="col-md-6" style="margin-bottom: 8px;">';
		info_html += `<strong>${article.short_name}:</strong><br>`;
		info_html += `<small style="color: #6c757d;">${article.full_name}</small>`;
		info_html += '</div>';
	});
	
	info_html += '</div></div>';
	
	frappe.msgprint({
		title: __("Tax Articles Information"),
		message: info_html,
		wide: true
	});
}

// Функция добавления статистики под таблицу
function add_tax_statistics(datatable_obj) {
	if (datatable_obj && datatable_obj.data) {
		let summary = calculate_tax_totals(datatable_obj.data);
		
		let stats_html = '<div class="tax-statistics" style="margin-top: 20px; padding: 20px; background: #f8f9fa; border-radius: 8px; border: 1px solid #dee2e6;">';
		stats_html += '<h4 style="margin-bottom: 15px; color: #495057;">📊 Сводка по налоговым статьям:</h4>';
		
		// Группируем по типам статей
		let grouped_summary = group_summary_by_type(summary);
		
		Object.keys(grouped_summary).forEach(group_name => {
			stats_html += `<h5 style="margin-top: 15px; margin-bottom: 10px; color: #495057;">${group_name}</h5>`;
			stats_html += '<div class="row">';
			
			grouped_summary[group_name].forEach((item, index) => {
				if (index % 2 === 0 && index > 0) {
					stats_html += '</div><div class="row">';
				}
				
				stats_html += '<div class="col-md-6" style="margin-bottom: 10px;">';
				stats_html += `<div style="padding: 10px; border: 1px solid #dee2e6; border-radius: 4px; background: white;">`;
				stats_html += `<strong>${item.article}</strong><br>`;
				stats_html += `<small>Активов: ${item.assets_count} | От: ${item.total_value_from.toFixed(2)} | До: ${item.total_value_to.toFixed(2)} | Страховка: ${item.total_insured.toFixed(2)}</small>`;
				stats_html += `</div>`;
				stats_html += '</div>';
			});
			
			stats_html += '</div>';
		});
		
		// Общие итоги
		let totals = summary.reduce((acc, item) => {
			acc.total_assets += item.assets_count;
			acc.total_value_from += item.total_value_from;
			acc.total_value_to += item.total_value_to;
			acc.total_insured += item.total_insured;
			return acc;
		}, {total_assets: 0, total_value_from: 0, total_value_to: 0, total_insured: 0});
		
		stats_html += `<div style="margin-top: 20px; padding-top: 15px; border-top: 2px solid #007bff;">`;
		stats_html += `<div class="row">`;
		stats_html += `<div class="col-md-3"><strong>Всего активов: ${totals.total_assets}</strong></div>`;
		stats_html += `<div class="col-md-3"><strong>Остаток на начало: ${totals.total_value_from.toFixed(2)}</strong></div>`;
		stats_html += `<div class="col-md-3"><strong>Остаток на конец: ${totals.total_value_to.toFixed(2)}</strong></div>`;
		stats_html += `<div class="col-md-3"><strong>Всего страховки: ${totals.total_insured.toFixed(2)}</strong></div>`;
		stats_html += `</div>`;
		stats_html += `</div>`;
		
		stats_html += '</div>';
		
		// Удаляем предыдущую статистику если есть
		$('.tax-statistics').remove();
		
		// Добавляем новую статистику
		$(stats_html).insertAfter('.datatable');
	}
}

// Группировка статей по типам
function group_summary_by_type(summary) {
	let grouped = {
		'Статья 199.1 (Льготы)': [],
		'Статьи 199.4 (Исключения)': [],
		'Статьи 199.5-199.20 (Специальные)': [],
		'Статья 227.1 (Прочие)': [],
		'Международные соглашения': []
	};
	
	summary.forEach(item => {
		if (item.article.includes('199.1')) {
			grouped['Статья 199.1 (Льготы)'].push(item);
		} else if (item.article.includes('199.4')) {
			grouped['Статьи 199.4 (Исключения)'].push(item);
		} else if (item.article.match(/199\.(5|7|8|9|11|14|15|16|17|18|19|20)/)) {
			grouped['Статьи 199.5-199.20 (Специальные)'].push(item);
		} else if (item.article.includes('227.1')) {
			grouped['Статья 227.1 (Прочие)'].push(item);
		} else {
			grouped['Международные соглашения'].push(item);
		}
	});
	
	// Удаляем пустые группы
	Object.keys(grouped).forEach(key => {
		if (grouped[key].length === 0) {
			delete grouped[key];
		}
	});
	
	return grouped;
}

// Вспомогательные функции

function get_tax_articles_list() {
	return [
		{short_name: "199.1 (Reduced)", full_name: "Vergi Məcəlləsinin 199.1-ci maddəsinə əsasən, azaldılmalı əmlak vergisinin məbləği"},
		{short_name: "199.4.1", full_name: "Vergi Məcəlləsinin 199.4.1-ci maddəsinə əsasən"},
		{short_name: "199.4.2", full_name: "Vergi Məcəlləsinin 199.4.2-ci maddəsinə əsasən"},
		{short_name: "199.4.3", full_name: "Vergi Məcəlləsinin 199.4.3-cü maddəsinə əsasən"},
		{short_name: "199.4.4", full_name: "Vergi Məcəlləsinin 199.4.4-cü maddəsinə əsasən"},
		{short_name: "199.4.1-1", full_name: "Vergi Məcəlləsinin 199.4.1-1-ci madacdəsinə əsasən"},
		{short_name: "199.5", full_name: "Vergi Məcəlləsinin 199.5-ci maddəsinə əsasən"},
		{short_name: "199.7", full_name: "Vergi Məcəlləsinin 199.7-ci maddəsinə əsasən"},
		{short_name: "199.8", full_name: "Vergi Məcəlləsinin 199.8-ci maddəsinə əsasən"},
		{short_name: "199.9", full_name: "Vergi Məcəlləsinin 199.9-cu maddəsinə əsasən"},
		{short_name: "199.11", full_name: "Vergi Məcəlləsinin 199.11-ci maddəsinə əsasən"},
		{short_name: "199.14", full_name: "Vergi Məcəlləsinin 199.14-cü maddəsinə əsasən"},
		{short_name: "199.15", full_name: "Vergi Məcəlləsinin 199.15-ci maddəsinə əsasən"},
		{short_name: "199.16", full_name: "Vergi Məcəlləsinin 199.16-cı maddəsinə əsasən"},
		{short_name: "199.17", full_name: "Vergi Məcəlləsinin 199.17-ci maddəsinə əsasən"},
		{short_name: "199.18", full_name: "Vergi Məcəlləsinin 199.18-ci maddəsinə əsasən"},
		{short_name: "199.19", full_name: "Vergi Məcəlləsinin 199.19-cu maddəsinə əsasən"},
		{short_name: "199.20", full_name: "Vergi Məcəlləsinin 199.20-ci maddəsinə əsasən"},
		{short_name: "227.1", full_name: "Vergi Məcəlləsinin 227.1-ci maddəsinə əsasən"},
		{short_name: "Profit Sharing", full_name: "Qanunla təsdiq olunmuş hasilatın pay bölgüsü haqqında, əsas boru kəməri haqqında və digər bu qəbildən olan sazişlərdə və ya qanunlarda, o cümlədən neft və qaz haqqında, ixrac məqsədli neft-qaz fəaliyyəti üzrə"},
		{short_name: "Economic Zones", full_name: "Xüsusi iqtisadi zonalar haqqında qanunlarda nəzərdə tutulan əmlaklar üzrə"},
		{short_name: "International", full_name: "Azərbaycan Respublikasının tərəfdar çıxdığı beynəlxalq müqavilələr üzrə"}
	];
}

function get_field_key_js(tax_article) {
	// Дублируем логику из Python для создания ключей полей
	if (!tax_article) {
		return "unknown";
	}
	
	if (tax_article.includes("199.1-ci") && tax_article.includes("azaldılmalı")) {
		return "article_199_1_reduced";
	} else if (tax_article.includes("199.4.1-1-ci")) {
		return "article_199_4_1_1";
	} else if (tax_article.includes("199.4.1-ci")) {
		return "article_199_4_1";
	} else if (tax_article.includes("199.4.2-ci")) {
		return "article_199_4_2";
	} else if (tax_article.includes("199.4.3-cü")) {
		return "article_199_4_3";
	} else if (tax_article.includes("199.4.4-cü")) {
		return "article_199_4_4";
	} else if (tax_article.includes("199.5-ci")) {
		return "article_199_5";
	} else if (tax_article.includes("199.7-ci")) {
		return "article_199_7";
	} else if (tax_article.includes("199.8-ci")) {
		return "article_199_8";
	} else if (tax_article.includes("199.9-cu")) {
		return "article_199_9";
	} else if (tax_article.includes("199.11-ci")) {
		return "article_199_11";
	} else if (tax_article.includes("199.14-cü")) {
		return "article_199_14";
	} else if (tax_article.includes("199.15-ci")) {
		return "article_199_15";
	} else if (tax_article.includes("199.16-cı")) {
		return "article_199_16";
	} else if (tax_article.includes("199.17-ci")) {
		return "article_199_17";
	} else if (tax_article.includes("199.18-ci")) {
		return "article_199_18";
	} else if (tax_article.includes("199.19-cu")) {
		return "article_199_19";
	} else if (tax_article.includes("199.20-ci")) {
		return "article_199_20";
	} else if (tax_article.includes("227.1-ci")) {
		return "article_227_1";
	} else if (tax_article.includes("pay bölgüsü")) {
		return "article_profit_sharing";
	} else if (tax_article.includes("iqtisadi zonalar")) {
		return "article_economic_zones";
	} else if (tax_article.includes("beynəlxalq müqavilələr")) {
		return "article_international";
	} else {
		return "article_other";
	}
}