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

import frappe
from frappe.model.document import Document
from frappe import _
from frappe.utils import flt, getdate, add_months, cint
from datetime import datetime, date
import calendar

class Declarationofvalueaddedtax(Document):
	pass


# Azərbaycan month names (matches the `ay` Select field), index 0 -> January.
MONTHS_AZ = [
	"Yanvar", "Fevral", "Mart", "Aprel", "May", "İyun",
	"İyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr",
]

# Report act_type -> the declaration's "sənəd növü" Select option.
ACT_TYPE_MAP = {
	"EQF": "EQF",
	"Purchase Act": "Alış aktı",
	"Import": "İdxal",
}


def _period_filters(year, month):
	"""Build report filters (company + month date range) from year + month."""
	from frappe.utils import get_last_day

	company = (frappe.defaults.get_user_default("Company")
		or frappe.db.get_single_value("Global Defaults", "default_company"))

	month_idx = MONTHS_AZ.index(month) + 1
	from_date = f"{cint(year):04d}-{month_idx:02d}-01"
	to_date = str(get_last_day(from_date))

	return {"company": company, "from_date": from_date, "to_date": to_date}


# Line codes of the new Əlavə 1 summary table (əlavə1_2_yeni). The stored
# `sətirkodu` values carry a long description after the code, so rows are
# matched on this prefix rather than on the full option string.
VAT_OFFSET_LINE_CODES = ["308", "314", "316"]


@frappe.whitelist()
def populate_vat_tables(year, month):
	"""Build the VAT declaration appendix rows from the source reports.

	Returns row dicts for:
	  - Əlavə 1            (əlavə_1)        <- Purchase YGB VAT report
	  - Əlavə 1 cəmi       (əlavə_1_2)      <- totals over Əlavə 1
	  - Əlavə 1 yeni       (əlavə1_yeni)    <- Purchase VAT offset report
	  - Əlavə 1 yeni cəmi  (əlavə1_2_yeni)  <- totals per line code
	  - Əlavə 2 Hissə 1    (əlavə_2)        <- Purchase invoice info report
	  - Əlavə 2 Hissə 2    (əlavə_2_2)      <- Agricultural goods stock report
	  - Əlavə 8 Tablo 2    (müəssisə_malın_dəyəri) <- Certificate VAT report
	  - Əlavə 8 cəmi       (elave_8_total)  <- total of the Əlavə 8 values

	The two summary tables already carry their rows (created by a client
	script), so only values are returned — the caller fills existing rows
	instead of rebuilding them.
	"""
	from taxes_az.taxes_az.report.purchase_ygb_vat_report.purchase_ygb_vat_report import (
		get_data as ygb_get_data,
	)
	from taxes_az.taxes_az.report.purchase_invoice_info_report.purchase_invoice_info_report import (
		get_data as purchase_info_get_data,
	)
	from taxes_az.taxes_az.report.agricultural_goods_stock_report.agricultural_goods_stock_report import (
		get_data as agri_get_data,
	)
	from taxes_az.taxes_az.report.certificate_vat_report.certificate_vat_report import (
		get_data as certificate_get_data,
	)
	from taxes_az.taxes_az.report.purchase_vat_offset_report.purchase_vat_offset_report import (
		get_data as vat_offset_get_data,
	)

	if not month or not year:
		return {"success": False, "error": "Year and month are required"}

	filters = _period_filters(year, month)

	# Əlavə 1 — one row per YGB purchase document.
	elave_1 = []
	for r in (ygb_get_data(filters) or []):
		elave_1.append({
			"sətirkodu": r.get("line_code"),
			"ygbnintarixi": r.get("posting_date"),
			"ygbninnömrəsi": r.get("ygb"),
			"ygbüzrəalınmışmalınədvsizdəyərimanatla": r.get("amount_without_vat"),
			"ygbüzrəalınmışmalınədvməbləğimanatla": r.get("vat_amount"),
		})

	# Əlavə 1 cəmi — the single pre-created summary row over Əlavə 1.
	elave_1_2 = {
		"malınədvsizümumidəyəri": sum(flt(r["ygbüzrəalınmışmalınədvsizdəyərimanatla"]) for r in elave_1),
		"malınədvməbləği": sum(flt(r["ygbüzrəalınmışmalınədvməbləğimanatla"]) for r in elave_1),
	}

	# Əlavə 1 (yeni) — one row per VAT-offset purchase invoice.
	elave_1_yeni = []
	for r in (vat_offset_get_data(filters) or []):
		elave_1_yeni.append({
			"sətirkodu": r.get("line_code"),
			"tarix": r.get("posting_date"),
			"vöenadı": r.get("voen_name"),
			"qaiməninseriyası": r.get("invoice_series"),
			"qaiməninnömrəsi": r.get("invoice_number"),
			"ümumiməbləğmanatla": r.get("total_amount"),
			"ədvməbləğimanatla": r.get("vat_amount"),
			"ödənilmişümumiməbləğmanatla": r.get("paid_total"),
			"ödənilmişədvməbləğimanatla": r.get("paid_vat"),
		})

	# Əlavə 1 (yeni) cəmi — totals per line code, keyed by the bare code. Every
	# code is present so a code that lost its rows is zeroed rather than stale.
	elave_1_2_yeni = {
		code: {
			"ümumiməbləğmanatla": 0.0,
			"ədvməbləğimanatla": 0.0,
			"ödənilmişümumiməbləğmanatla": 0.0,
			"ödənilmişədvməbləğimanatla": 0.0,
		}
		for code in VAT_OFFSET_LINE_CODES
	}
	for r in elave_1_yeni:
		bucket = elave_1_2_yeni.get(str(r["sətirkodu"] or "").strip())
		if not bucket:
			continue
		bucket["ümumiməbləğmanatla"] += flt(r["ümumiməbləğmanatla"])
		bucket["ədvməbləğimanatla"] += flt(r["ədvməbləğimanatla"])
		bucket["ödənilmişümumiməbləğmanatla"] += flt(r["ödənilmişümumiməbləğmanatla"])
		bucket["ödənilmişədvməbləğimanatla"] += flt(r["ödənilmişədvməbləğimanatla"])

	# Əlavə 2 Hissə 1 — one row per agricultural purchase document.
	elave_2 = []
	for r in (purchase_info_get_data(filters) or []):
		elave_2.append({
			"malalışınıtəsdiqedənsənədnövününadı": ACT_TYPE_MAP.get(r.get("act_type"), r.get("act_type")),
			"adı": r.get("counterparty"),
			"vöen": r.get("voen") or None,
			"fin": r.get("fin"),
			"hesabatdövrüərzindəalınmışmallarınalışqiymətiiləməbləği": r.get("amount"),
		})

	# Əlavə 2 Hissə 2 — single summary row (agricultural goods movement).
	elave_2_2 = []
	for r in (agri_get_data(filters) or []):
		elave_2_2.append({
			"hesabatdövrününəvvəlinəsatılmamışmallarınalışqiymətiiləməbləği": r.get("opening_balance"),
			"dövrərzindəalınmışmallarınalışqiymətiiləməbləği": r.get("purchased"),
			"dövrərzindəsatılmışmallarınsatışqiymətiiləməbləği": r.get("sold"),
			"dövrsonunamallarınalışqiymətiiləqalıqməbləği": r.get("closing_balance"),
			"carihesabatdövründəsatılmışmallaragörəticarətəlavəsi": r.get("trade_markup"),
			"hesabatdövründəsatılmışmallaragörəticarətəlavəsininədvməbləği": r.get("trade_markup_vat"),
		})

	# Əlavə 8 Tablo 2 (müəssisə_malın_dəyəri) — one row per certificate presented
	# on a sales invoice, with the value of goods supplied under it. The full
	# item amount is kept per certificate (no splitting across certificates).
	elave_8_2 = []
	for r in (certificate_get_data(filters) or []):
		elave_8_2.append({
			"sertifikatınseriyanömrəsi": r.get("cert_no"),
			"sertifikattəqdimolunanşəxsinvöeni": r.get("voen") or None,
			"sertifikattəqdimolunanşəxsinadı": r.get("taxpayer_full_name"),
			"sertifikataltındatəqdimolunanmallarınişlərinxidmətlərindəyəri": r.get("value"),
		})

	# Əlavə 8 — page total of the values listed in Tablo 2.
	elave_8_total = sum(
		flt(r["sertifikataltındatəqdimolunanmallarınişlərinxidmətlərindəyəri"]) for r in elave_8_2
	)

	return {
		"success": True,
		"elave_1": elave_1,
		"elave_1_2": elave_1_2,
		"elave_1_yeni": elave_1_yeni,
		"elave_1_2_yeni": elave_1_2_yeni,
		"elave_2": elave_2,
		"elave_2_2": elave_2_2,
		"elave_8_2": elave_8_2,
		"elave_8_total": elave_8_total,
		"period": filters,
	}