// Vahid "Dövr" seçici bütün ФНО (bəyannamələr) üçün.
//
// Köhnə `ay` / `il` / `rüb` sahələri gizlədilir (hidden), amma silinmir və dəyəri
// əvvəlki kimi (eyni formatda) doldurulur. İstifadəçi `dövr` sahəsinə klikləyir ->
// standart Frappe air-datepicker açılır (modal DEYİL, adi date sahəsi kimi popup):
//   month       -> ay şəbəkəsi (Azərbaycan ay adları ilə)
//   quarter_*   -> "1. Rüb".."4. Rüb" (ay görünüşü, hücrələr yenidən adlandırılır)
//   annual      -> yalnız il şəbəkəsi
// Seçim geriyə `ay`/`il`/`rüb`-a yazılır (format DƏYİŞMİR — downstream kod ona güvənir):
//   ay  -> "Yanvar".."Dekabr" VƏ YA "1. Rüb".."4. Rüb"
//   rüb -> "1. Rüb".."4. Rüb"
//   il  -> Int (məs. 2026)

frappe.provide("taxes_az.dovr");

(function () {
	const MONTHS = [
		"Yanvar", "Fevral", "Mart", "Aprel", "May", "İyun",
		"İyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr",
	];
	const QUARTERS = ["1. Rüb", "2. Rüb", "3. Rüb", "4. Rüb"];

	const CONFIG = {
		// ── month (ay 12 ay + il) ──
		"Declaration of mining tax": "month",
		"Declaration of simplified tax on cash withdrawals": "month",
		"Declaration of value added tax": "month",
		"Declaration of withholding tax on winnings": "month",
		"Excise declaration": "month",
		"Export declaration": "month",
		"Real estate simplified tax declaration": "month",
		"Road tax 2": "month",
		"VAT calculated on the amount paid to a non-resident": "month",

		// ── quarter, dəyər `ay` sahəsində saxlanır ──
		"Income tax return of a private notary": "quarter_ay",
		"Tax return withheld at source of payment": "quarter_ay",

		// ── quarter, dəyər `rüb` sahəsində saxlanır ──
		"Building construction and simplified tax declaration": "quarter_rub",
		"Declaration of simplified tax": "quarter_rub",
		"Housing construction simplified tax declaration": "quarter_rub",
		"Quarterly report on unemployment insurance": "quarter_rub",
		"Report on collection of state duty": "quarter_rub",
		"Single declaration related to salaried and non-salaried work": "quarter_rub",
		"Withholding tax return of foreign subcontractors": "quarter_rub",

		// ── annual (yalnız il) ──
		"Income tax return": "annual",
		"Land tax declaration": "annual",
		"Profit tax with special tax regime": "annual",
		"Property tax return": "annual",
		"REFERENCE on controlled transactions": "annual",
	};

	taxes_az.dovr.CONFIG = CONFIG;

	// Proqram vasitəsilə selectDate edərkən onSelect-i susdurmaq üçün.
	const guard = { on: false };

	function period_field(mode) {
		if (mode === "quarter_rub") return "rüb";
		if (mode === "month" || mode === "quarter_ay") return "ay";
		return null; // annual
	}
	function is_quarter(mode) {
		return mode === "quarter_ay" || mode === "quarter_rub";
	}

	function build_label(mode, period, year) {
		if (!year) return "";
		if (mode === "annual") return String(year);
		if (!period) return "";
		return period + " " + year; // "Mart 2026" / "1. Rüb 2026"
	}

	function current_label(frm, mode) {
		const il = frm.doc.il;
		if (mode === "annual") return build_label(mode, null, il);
		return build_label(mode, frm.doc[period_field(mode)], il);
	}

	// `dövr` göstərici mətnini mövcud ay/il/rüb-dən yeniləyir (doc-u "dirty" etmədən).
	function sync_display(frm, mode) {
		const label = current_label(frm, mode);
		if ((frm.doc["dövr"] || "") !== label) {
			frm.doc["dövr"] = label;
			frm.refresh_field("dövr");
		}
	}

	// Cari dəyərə uyğun ay indeksi (0-11) — popup-u düzgün yerdə açmaq üçün.
	function current_month_index(frm, mode) {
		if (mode === "month") {
			const i = MONTHS.indexOf(frm.doc.ay);
			return i >= 0 ? i : new Date().getMonth();
		}
		if (is_quarter(mode)) {
			const q = QUARTERS.indexOf(frm.doc[period_field(mode)]);
			return (q >= 0 ? q : 0) * 3;
		}
		return 0;
	}

	// Seçilmiş tarixi ay/il/rüb + dövr-a yazır və hesablamaları BİR DƏFƏ işə salır.
	//
	// Niyə `frm.set_value()` yox:
	//   set_value hər sahə üçün ayrıca trigger qoyur, triggerlər isə asinxron
	//   işləyir (frappe.model.set_value -> run_serially). Yəni `ay` və `il`
	//   dəyərləri hər ikisi frm.doc-a düşəndən sonra HƏR İKİ handler işə düşür və
	//   bütün hesablama iki dəfə aparılır (VAT-da həm də populate_vat_tables iki
	//   dəfə çağırılır).
	//   Üstəlik set_value dəyər dəyişməyibsə heç nə etmir (`doc[key] !== value`),
	//   ona görə yalnız ayı dəyişəndə (il eyni qalanda) `il`-ə arxalanmaq olmaz —
	//   nə trigger, nə də dirty olardı.
	//
	// Ona görə set_value-nun etdiklərini əl ilə təkrarlayırıq və trigger-i bir dəfə
	// özümüz çağırırıq. Bu təhlükəsizdir: bütün ФНО-larda period handler-i ilə `il`
	// handler-inin gövdəsi eynidir (formula editor hər asılı sahə üçün eyni bloku
	// generasiya edir), `calculate_table_row_field`-in triggerField arqumenti isə
	// heç yerdə istifadə olunmur.
	function apply_selection(frm, mode, date) {
		const year = date.getFullYear();
		const pf = period_field(mode); // "ay" | "rüb" | null (annual)
		let period = null;

		if (pf) {
			period = (mode === "month")
				? MONTHS[date.getMonth()]
				: QUARTERS[Math.floor(date.getMonth() / 3)];
			frm.doc[pf] = period;
		}
		frm.doc.il = year;
		frm.doc["dövr"] = build_label(mode, period, year);

		if (pf) frm.refresh_field(pf);
		frm.refresh_field("il");
		frm.refresh_field("dövr");
		frm.layout.refresh_dependency();
		frm.dirty();

		// Hesablamaları bir dəfə işə salırıq. Adətən `il` handler-i var; yoxdursa
		// period sahəsinin handler-inə geri düşürük.
		const bound = frappe.ui.form.handlers[frm.doctype] || {};
		const on = (bound["il"] || []).length ? "il" : pf;
		if (on) {
			frm.script_manager.trigger(on, frm.doctype, frm.docname);
		}
	}

	function inject_style() {
		if (document.getElementById("dovr-period-style")) return;
		const st = document.createElement("style");
		st.id = "dovr-period-style";
		st.textContent = [
			// klik oluna bilən görünüş (readonly input -> pointer)
			'[data-fieldname="dövr"], [data-fieldname="dövr"] input,',
			'[data-fieldname="dövr"] .control-input{cursor:pointer!important;}',
			// ay adları tam olduğuna görə bir az kiçildirik
			".dovr-month-dp .datepicker--cell-month{font-size:11px;}",
			// rüb şəbəkəsi: yalnız 4 hücrə, səliqəli 2×2
			".dovr-quarter-dp .datepicker--cells-months{height:auto;}",
			".dovr-quarter-dp .datepicker--cell-month{width:50%;height:46px;font-weight:600;}",
			".dovr-quarter-dp .datepicker--cell-month.dovr-q-off{display:none;}",
		].join("");
		document.head.appendChild(st);
	}

	function setup_picker(frm, mode, field) {
		const $inp = field.$wrapper.find("input");
		if (!$inp.length) return;

		// Artıq qurulubsa (input re-render olmayıbsa) təkrar etmə.
		if ($inp.data("datepicker")) return;

		const annual = mode === "annual";
		const quarter = is_quarter(mode);

		let lang = "en";
		if (frappe.boot.user && $.fn.datepicker.language[frappe.boot.user.language]) {
			lang = frappe.boot.user.language;
		}

		const opts = {
			language: lang,
			autoClose: true,
			toggleSelected: false,
			dateFormat: " ", // öz etiketimizi yazırıq
			minView: annual ? "years" : "months",
			view: annual ? "years" : "months",
			onSelect: function (fmt, date) {
				if (!date || guard.on) return;
				apply_selection(frm, mode, Array.isArray(date) ? date[0] : date);
			},
			onRenderCell: function (date, cellType) {
				if (cellType !== "month") return;
				const m = date.getMonth();
				if (quarter) {
					if (m % 3 === 0) return { html: QUARTERS[m / 3] };
					return { disabled: true, classes: "dovr-q-off" };
				}
				if (mode === "month") return { html: MONTHS[m] };
			},
		};

		$inp.datepicker(opts);
		const dp = $inp.data("datepicker");
		dp.$datepicker.addClass(
			quarter ? "dovr-quarter-dp" : annual ? "dovr-year-dp" : "dovr-month-dp"
		);

		// Cari dəyəri seçili göstər (onSelect susdurulur), sonra etiketi bərpa et.
		const y = frm.doc.il ? cint(frm.doc.il) : new Date().getFullYear();
		guard.on = true;
		try {
			dp.selectDate(new Date(y, annual ? 0 : current_month_index(frm, mode), 1));
		} catch (e) {
			// ignore
		}
		guard.on = false;
		$inp.val(frm.doc["dövr"] || "");

		// readonly input-a klik -> popup (fokus onsuz da açır, bu təhlükəsizlik üçün)
		$inp.off("click.dovr").on("click.dovr", function () {
			dp.show();
		});
	}

	taxes_az.dovr.attach = function (frm) {
		const mode = CONFIG[frm.doctype];
		if (!mode) return;
		const field = frm.fields_dict["dövr"];
		if (!field) return;

		inject_style();
		sync_display(frm, mode);

		// Sahə oxunan (read_only) DEYİL ki, boş olanda gizlənməsin
		// (System Settings > hide_empty_read_only_fields). Klaviatura ilə yazmağı
		// bloklayırıq (dəyər yalnız popup-dan dəyişir), amma kliklənə bilən görünür.
		field.$wrapper.find("input").attr("readonly", "readonly");
		setup_picker(frm, mode, field);
	};

	// Bütün konfiqurasiya olunmuş doctype-lar üçün refresh handler qeyd olunur;
	// yalnız açıq olan forma tetiklenir.
	Object.keys(CONFIG).forEach(function (dt) {
		frappe.ui.form.on(dt, {
			refresh: function (frm) {
				taxes_az.dovr.attach(frm);
			},
		});
	});
})();
