from __future__ import annotations

from datetime import datetime

"""Tax risk auditing and non-deductible invoice detector."""


import json
import logging
from typing import Any

logger = logging.getLogger(__name__)


class InvoiceAnalyticsRiskAuditMixin:
    """Mixin for tax risk auditing."""

    def audit_invoice_tax_risk(self, invoice_id: str) -> dict[str, Any]:
        """Rà soát rủi ro thuế, tính toàn vẹn chữ ký số và độ lệch thuế suất."""
        inv = self.get_invoice_detail(invoice_id)
        if not inv:
            return {"status": "error", "message": "Không tìm thấy hóa đơn cần rà soát."}

        risk_points = 0
        risk_flags: list[dict[str, str]] = []

        # 1. Check Digital Signature & Cash Register (MTT) Exemption Rule
        is_mtt = self.is_cash_register_invoice(
            inv.get("invoice_series"), str(inv.get("template_code", ""))
        )
        clean_signer, clean_sign_date = self._clean_signer_info(
            inv.get("signed_by"), inv.get("signed_at"), inv.get("seller_name")
        )

        if is_mtt:
            # Under Clause 3 Article 11 Decree 123/2020/ND-CP and Article 8 Circular 78/2021/TT-BTC,
            # Cash register electronic invoices with Tax Authority Code are exempt from seller's digital signature.
            risk_flags.append(
                {
                    "type": "SIGNATURE_EXEMPT_MTT",
                    "severity": "safe",
                    "message": "Hóa đơn khởi tạo từ máy tính tiền có mã CQT: Hợp lệ theo Khoản 3 Điều 11 NĐ 123/2020/NĐ-CP (Miễn trừ chữ ký số người bán).",
                }
            )
        elif not inv.get("signature_valid"):
            risk_points += 40
            risk_flags.append(
                {
                    "type": "SIGNATURE_INVALID",
                    "severity": "high",
                    "message": "Chữ ký số không hợp lệ hoặc không có chứng thư số đính kèm.",
                }
            )
        else:
            sig_detail = f"Đã ký bởi: {clean_signer}"
            if clean_sign_date:
                sig_detail += f" — Ngày ký: {clean_sign_date}"
            risk_flags.append(
                {
                    "type": "SIGNATURE_VERIFIED",
                    "severity": "safe",
                    "message": f"Chữ ký số hợp lệ ({sig_detail}).",
                }
            )

        # 2. Check Tax Code Validity (MST 10 or 14 digits)
        mst = str(inv.get("seller_tax_code") or "").strip()
        if not (len(mst) == 10 or (len(mst) == 14 and "-" in mst)):
            risk_points += 25
            risk_flags.append(
                {
                    "type": "TAX_CODE_MALFORMED",
                    "severity": "medium",
                    "message": f"Mã số thuế bên bán '{mst}' không đúng quy chuẩn (10 hoặc 14 ký tự).",
                }
            )
        else:
            risk_flags.append(
                {
                    "type": "TAX_CODE_VALID",
                    "severity": "safe",
                    "message": f"Mã số thuế bên bán ({mst}) hợp lệ theo chuẩn Tổng Cục Thuế.",
                }
            )

        # 3. Check Date consistency (Decree 123/2020/ND-CP)
        issue_d_str = str(inv.get("issue_date") or "")
        sign_dt = None
        if inv.get("signed_by") and "SigningTime" in str(inv.get("signed_by")):
            try:
                sb = json.loads(str(inv.get("signed_by")))
                if sb.get("SigningTime"):
                    st = str(sb["SigningTime"]).strip()
                    if "T" in st:
                        sign_dt = datetime.fromisoformat(
                            st.replace("Z", "+00:00")
                        ).date()
                    elif "/" in st:
                        sign_dt = datetime.strptime(st[:10], "%d/%m/%Y").date()
                    elif "-" in st:
                        sign_dt = datetime.strptime(st[:10], "%Y-%m-%d").date()
            except Exception:
                pass

        if not sign_dt and inv.get("signed_at"):
            try:
                sign_dt = datetime.fromisoformat(
                    str(inv.get("signed_at")).replace("Z", "+00:00")
                ).date()
            except Exception:
                pass

        if issue_d_str and sign_dt:
            try:
                i_date = datetime.strptime(issue_d_str[:10], "%Y-%m-%d").date()
                diff_days = (sign_dt - i_date).days
                s_disp = sign_dt.strftime("%d/%m/%Y")
                i_disp = i_date.strftime("%d/%m/%Y")
                if diff_days > 30:
                    risk_points += 30
                    risk_flags.append(
                        {
                            "type": "SIGNING_DELAY",
                            "severity": "high",
                            "message": f"Ngày ký số ({s_disp}) trễ hơn ngày lập ({i_disp}) {diff_days} ngày (Vượt quá thời hạn quy định NĐ123).",
                        }
                    )
                elif diff_days < 0:
                    if abs(diff_days) <= 1:
                        risk_flags.append(
                            {
                                "type": "SIGNING_DATE_VALID",
                                "severity": "safe",
                                "message": f"Ngày ký số ({s_disp}) và ngày lập ({i_disp}) hợp lệ theo chuẩn NĐ123.",
                            }
                        )
                    else:
                        risk_points += 15
                        risk_flags.append(
                            {
                                "type": "SIGNING_BEFORE_ISSUE",
                                "severity": "medium",
                                "message": f"Ngày ký số ({s_disp}) trước ngày lập hóa đơn ({i_disp}).",
                            }
                        )
                else:
                    risk_flags.append(
                        {
                            "type": "SIGNING_DATE_VALID",
                            "severity": "safe",
                            "message": f"Ngày ký số ({s_disp}) và ngày lập ({i_disp}) hoàn toàn hợp lệ theo chuẩn NĐ123.",
                        }
                    )
            except Exception:
                pass

        # 4. Check Tax Calculation Balance
        subtotal = float(inv.get("subtotal_amount_vnd") or 0.0)
        vat = float(inv.get("vat_amount_vnd") or 0.0)
        tot = float(inv.get("total_amount_vnd") or 0.0)
        if subtotal > 0 and abs((subtotal + vat) - tot) > 100:
            risk_points += 35
            risk_flags.append(
                {
                    "type": "TAX_SUM_MISMATCH",
                    "severity": "high",
                    "message": f"Sai lệch số học: Tiền trước thuế ({subtotal:,.0f}) + Thuế ({vat:,.0f}) != Tổng thanh toán ({tot:,.0f}).",
                }
            )

        # Determine level
        if risk_points >= 40:
            level = "high"
            recommendation = "CẢNH BÁO RỦI RO CAO: Tạm dừng thanh toán đối với hóa đơn này và yêu cầu bên bán cấp lại hóa đơn thay thế hoặc biên bản điều chỉnh."
        elif risk_points >= 20:
            level = "medium"
            recommendation = "RỦI RO TRUNG BÌNH: Cần kế toán trưởng đối soát chi tiết hợp đồng và chứng từ chuyển tiền ngân hàng trước khi khấu trừ thuế."
        else:
            level = "low"
            recommendation = "AN TOÀN: Hóa đơn hợp lệ, đầy đủ chữ ký số và đủ điều kiện khấu trừ thuế GTGT đầu vào."

        return {
            "invoice_id": invoice_id,
            "invoice_number": inv.get("invoice_number"),
            "seller_name": inv.get("seller_name"),
            "risk_score": risk_points,
            "risk_level": level,
            "risk_flags": risk_flags,
            "recommendation": recommendation,
            "audit_timestamp": datetime.now().isoformat(),
        }
