"""EPR 业务生成日志写入：写入 epr_fr_battery_file_log（按 code 单行合并，step 置空）。"""
from __future__ import annotations

from datetime import datetime

from sqlalchemy import text

from app.core.database import TargetSessionLocal
from app.core.logger import get_logger

logger = get_logger(__name__)


def insert_epr_generate_log(
    *,
    batch_id: str | None = None,
    code: str | None = None,
    vat_reg_info_id: str | None = None,
    enterprise_name: str | None = None,
    country: str | None = None,
    level: str,
    message: str | None = None,
    detail: str | None = None,
) -> None:
    """写一行生成日志到 epr_fr_battery_file_log（step 置空）。

    message 为合并后的过程信息、detail 为合并后的异常信息；按 code 定位唯一一行（step IS NULL），
    存在则覆盖更新，否则插入。失败仅记日志，不阻断主流程。
    """
    table = "epr_fr_battery_file_log"
    try:
        with TargetSessionLocal() as session:
            now = datetime.now()
            params = {
                "batch_id": batch_id,
                "code": code,
                "vat_reg_info_id": vat_reg_info_id,
                "enterprise_name": enterprise_name,
                "country": country,
                "level": level,
                "message": message,
                "detail": detail,
                "updated_at": now,
            }

            if code is None:
                existing = session.execute(
                    text(f"SELECT id FROM {table} WHERE code IS NULL AND step IS NULL")
                ).first()
            else:
                existing = session.execute(
                    text(f"SELECT id FROM {table} WHERE code = :code AND step IS NULL"),
                    {"code": code},
                ).first()

            if existing is not None:
                session.execute(
                    text(
                        f"UPDATE {table} SET batch_id = :batch_id, vat_reg_info_id = :vat_reg_info_id, "
                        "enterprise_name = :enterprise_name, country = :country, level = :level, "
                        "message = :message, detail = :detail, updated_at = :updated_at WHERE id = :id"
                    ),
                    {**params, "id": existing[0]},
                )
            else:
                session.execute(
                    text(
                        f"INSERT INTO {table} "
                        "(batch_id, code, vat_reg_info_id, enterprise_name, country, step, level, message, detail, updated_at) "
                        "VALUES (:batch_id, :code, :vat_reg_info_id, :enterprise_name, :country, NULL, :level, :message, :detail, :updated_at)"
                    ),
                    params,
                )
            session.commit()
    except Exception as exc:  # noqa: BLE001
        logger.error("写生成日志失败: %s", exc)
