"""Convert official Vietnamese-key ReviewPanel JSON into be01 `data_blank.json` shape."""

from __future__ import annotations

import copy
import json
from pathlib import Path
from typing import Any, Dict

_DATA_BLANK_PATH = Path(__file__).parent / "data_blank.json"


def _s(v: Any) -> str:
    if v is None:
        return ""
    return str(v).strip()


def _resolve_don_vi_cong_tac(official: Dict[str, Any]) -> str:
    """
    TRANG BÌA / Mẫu 02 « Đơn vị » for docxtpl (`trang_bia.don_vi`, `mau_02.don_vi`).

    Aligns with fe0 `resolveDonViCongTacDisplay`: explicit cover/Mẫu02 fields first, then
    first author « Nơi công tác », then Mẫu 03 « Chức vụ, đơn vị », then first Mẫu 03
    table row. Older rows in DB may have empty « Đơn vị công tác » but filled author
    workplace — this fills the Word context without re-saving from the SPA.
    """
    bia = official.get("TRANG BÌA") if isinstance(official.get("TRANG BÌA"), dict) else {}
    m02 = official.get("MẪU SỐ 02 - ĐƠN ĐỀ NGHỊ CÔNG NHẬN SÁNG KIẾN")
    m02 = m02 if isinstance(m02, dict) else {}
    m03 = official.get("MẪU SỐ 03 - BẢN XÁC NHẬN TỶ LỆ (%) ĐÓNG GÓP VÀO VIỆC TẠO RA SÁNG KIẾN")
    m03 = m03 if isinstance(m03, dict) else {}

    for val in (_s(bia.get("Đơn vị công tác")), _s(m02.get("Đơn vị"))):
        if val:
            return val

    dstg = m02.get("Danh sách tác giả")
    if isinstance(dstg, list) and dstg:
        row0 = dstg[0]
        if isinstance(row0, dict):
            noi = _s(row0.get("Nơi công tác"))
            if noi:
                return noi

    chuc = _s(m03.get("Chức vụ, đơn vị công tác"))
    if chuc:
        return chuc

    tyle = m03.get("Tỷ lệ đóng góp")
    if isinstance(tyle, list):
        for row in tyle:
            if isinstance(row, dict):
                dv = _s(row.get("Đơn vị công tác"))
                if dv:
                    return dv
    return ""


def _blank() -> Dict[str, Any]:
    with open(_DATA_BLANK_PATH, "r", encoding="utf-8") as handle:
        return json.load(handle)


def official_to_data_blank(official: Dict[str, Any]) -> Dict[str, Any]:
    out = copy.deepcopy(_blank())
    don_vi_resolved = _resolve_don_vi_cong_tac(official)

    bia = official.get("TRANG BÌA") if isinstance(official.get("TRANG BÌA"), dict) else {}
    out["trang_bia"]["ten_sang_kien"] = str(bia.get("Tên sáng kiến (Tiếng Việt)") or "")
    out["trang_bia"]["tac_gia"] = str(bia.get("Tác giả/nhóm tác giả sáng kiến") or "")
    out["trang_bia"]["don_vi"] = don_vi_resolved
    out["trang_bia"]["thong_tin_lien_he"] = str(bia.get("Thông tin liên hệ (Điện thoại, Email)") or "")
    out["trang_bia"]["nam"] = str(bia.get("Năm") or "")

    m01 = official.get("MẪU SỐ 01 - BÁO CÁO MÔ TẢ SÁNG KIẾN")
    if isinstance(m01, dict):
        out["mau_01"]["mo_dau"] = str(m01.get("1. Mở đầu") or "")
        out["mau_01"]["ten_sang_kien"] = str(
            m01.get("2. Tên sáng kiến (tên quy trình, giải pháp, phương pháp)") or ""
        )
        out["mau_01"]["linh_vuc_ap_dung"] = str(m01.get("3. Lĩnh vực áp dụng của sáng kiến") or "")
        m4 = m01.get("4. Mô tả sáng kiến") if isinstance(m01.get("4. Mô tả sáng kiến"), dict) else {}
        out["mau_01"]["tinh_trang_da_biet"] = str(
            m4.get("4.1 Tình trạng giải pháp đã biết hoặc hiện trạng công tác khi chưa có sáng kiến") or ""
        )
        inner = (
            m4.get("4.2 Nội dung giải pháp đề nghị công nhận là sáng kiến")
            if isinstance(m4.get("4.2 Nội dung giải pháp đề nghị công nhận là sáng kiến"), dict)
            else {}
        )
        out["mau_01"]["muc_dich"] = str(inner.get("Mục đích của sáng kiến") or "")
        nd = inner.get("Về nội dung của sáng kiến") if isinstance(inner.get("Về nội dung của sáng kiến"), dict) else {}
        out["mau_01"]["cac_buoc_thuc_hien"] = str(nd.get("Các bước thực hiện giải pháp") or "")
        out["mau_01"]["dieu_kien_ap_dung"] = str(nd.get("Các điều kiện cần thiết để áp dụng giải pháp") or "")
        out["mau_01"]["linh_vuc_ap_dung_2"] = str(nd.get("Lĩnh vực áp dụng") or "")
        out["mau_01"]["ket_qua_thu_duoc"] = str(nd.get("Kết quả thu được") or "")
        ds = nd.get("Danh sách đơn vị/cá nhân đã tham gia áp dụng thử hoặc lần đầu")
        if isinstance(ds, list) and ds:
            out["mau_01"]["danh_sach_ap_dung"] = [
                {
                    "tt": str(x.get("TT") or ""),
                    "ten_to_chuc": str(x.get("Tên tổ chức/cá nhân") or ""),
                    "dia_chi": str(x.get("Địa chỉ") or ""),
                    "linh_vuc": str(x.get("Lĩnh vực áp dụng sáng kiến") or ""),
                }
                for x in ds
                if isinstance(x, dict)
            ] or out["mau_01"]["danh_sach_ap_dung"]
        out["mau_01"]["tinh_moi"] = str(inner.get("Về tính mới của sáng kiến") or "")
        thq = inner.get("Về tính hiệu quả") if isinstance(inner.get("Về tính hiệu quả"), dict) else {}
        out["mau_01"]["tinh_hieu_qua"]["loi_ich_kinh_te"] = str(thq.get("Tạo ra lợi ích kinh tế") or "")
        out["mau_01"]["tinh_hieu_qua"]["hieu_qua_giang_day"] = str(thq.get("Đem lại hiệu quả trong giảng dạy") or "")
        out["mau_01"]["tinh_hieu_qua"]["tang_nang_suat"] = str(thq.get("Tăng năng suất lao động") or "")
        out["mau_01"]["tinh_hieu_qua"]["nang_cao_hieu_qua"] = str(thq.get("Nâng cao hiệu quả công việc") or "")
        out["mau_01"]["tinh_hieu_qua"]["nang_cao_chat_luong"] = str(
            thq.get("Nâng cao chất lượng công việc, dịch vụ") or ""
        )
        out["mau_01"]["tinh_hieu_qua"]["giam_chi_phi"] = str(thq.get("Giảm chi phí") or "")
        out["mau_01"]["tinh_hieu_qua"]["cai_thien_moi_truong"] = str(
            thq.get("Cải thiện môi trường, điều kiện học tập, làm việc, sống") or ""
        )
        out["mau_01"]["tinh_hieu_qua"]["bao_ve_suc_khoe"] = str(thq.get("Bảo vệ sức khỏe") or "")
        out["mau_01"]["tinh_hieu_qua"]["an_toan_lao_dong"] = str(thq.get("Đảm bảo an toàn lao động, PCCC") or "")
        out["mau_01"]["tinh_hieu_qua"]["nang_cao_nhan_thuc"] = str(
            thq.get("Nâng cao khả năng, trình độ, nhận thức, trách nhiệm") or ""
        )
        out["mau_01"]["thong_tin_bao_mat"] = str(m01.get("6. Những thông tin cần được bảo mật (nếu có)") or "")
        nk = m01.get("Ngày ký") if isinstance(m01.get("Ngày ký"), dict) else {}
        out["mau_01"]["ngay_ky"]["ngay"] = str(nk.get("Ngày") or "")
        out["mau_01"]["ngay_ky"]["thang"] = str(nk.get("Tháng") or "")
        out["mau_01"]["ngay_ky"]["nam"] = str(nk.get("Năm") or "")
        out["mau_01"]["lanh_dao_don_vi"] = str(m01.get("Lãnh đạo đơn vị (Ký, ghi rõ họ tên)") or "")
        out["mau_01"]["tac_gia_sang_kien"] = str(m01.get("Tác giả sáng kiến (Ký, ghi rõ họ tên)") or "")

    m02 = official.get("MẪU SỐ 02 - ĐƠN ĐỀ NGHỊ CÔNG NHẬN SÁNG KIẾN")
    if isinstance(m02, dict):
        out["mau_02"]["don_vi"] = don_vi_resolved
        dstg = m02.get("Danh sách tác giả")
        if isinstance(dstg, list) and dstg:
            out["mau_02"]["danh_sach_tac_gia"] = [
                {
                    "stt": str(x.get("STT") or ""),
                    "ho_ten": str(x.get("Họ và tên") or ""),
                    "ngay_sinh": str(x.get("Ngày tháng năm sinh") or ""),
                    "noi_cong_tac": str(x.get("Nơi công tác") or ""),
                    "chuc_danh": str(x.get("Chức danh") or ""),
                    "trinh_do": str(x.get("Trình độ chuyên môn") or ""),
                    "ty_le": str(x.get("Tỷ lệ (%) đóng góp vào việc tạo ra sáng kiến") or ""),
                }
                for x in dstg
                if isinstance(x, dict)
            ] or out["mau_02"]["danh_sach_tac_gia"]
        out["mau_02"]["ten_sang_kien"] = str(m02.get("Tên sáng kiến đề nghị xét công nhận") or "")
        out["mau_02"]["chu_dau_tu"] = str(m02.get("Chủ đầu tư tạo ra sáng kiến") or "")
        out["mau_02"]["linh_vuc_ap_dung"] = str(m02.get("Lĩnh vực áp dụng sáng kiến") or "")
        out["mau_02"]["ngay_ap_dung"] = str(m02.get("Ngày sáng kiến được áp dụng") or "")
        out["mau_02"]["noi_dung"] = str(m02.get("Nội dung của sáng kiến") or "")
        pl = m02.get("Phân loại sáng kiến (đánh dấu ☑)")
        if isinstance(pl, dict):
            k1 = "Giải pháp kỹ thuật, quản lý, tác nghiệp, ứng dụng tiến bộ kỹ thuật áp dụng cho ĐHYD TP.HCM"
            k2 = "Sáng kiến – cải tiến kỹ thuật từ các nghiên cứu khoa học có kết quả được đăng tải trên các tạp chí, hội nghị trong nước và quốc tế"
            k3 = "Sáng kiến – cải tiến kỹ thuật từ sách, giáo trình, tài liệu tham khảo"
            out["mau_02"]["phan_loai"]["giai_phap_ky_thuat"] = bool(pl.get(k1))
            out["mau_02"]["phan_loai"]["sang_kien_tu_nckh"] = bool(pl.get(k2))
            out["mau_02"]["phan_loai"]["sang_kien_tu_sach"] = bool(pl.get(k3))
        out["mau_02"]["thong_tin_bao_mat"] = str(m02.get("Những thông tin cần được bảo mật (nếu có)") or "")
        out["mau_02"]["dieu_kien_ap_dung"] = str(m02.get("Các điều kiện cần thiết để áp dụng sáng kiến") or "")
        out["mau_02"]["danh_gia_tac_gia"] = str(
            m02.get("Đánh giá lợi ích theo ý kiến của tác giả") or ""
        )
        out["mau_02"]["danh_gia_to_chuc"] = str(
            m02.get("Đánh giá lợi ích theo ý kiến của tổ chức, cá nhân đã tham gia áp dụng sáng kiến lần đầu")
            or ""
        )
        dsg = m02.get("Danh sách những người đã tham gia áp dụng thử hoặc áp dụng sáng kiến lần đầu")
        if isinstance(dsg, list) and dsg:
            out["mau_02"]["danh_sach_tham_gia"] = [
                {
                    "stt": str(x.get("Số TT") or ""),
                    "ho_ten": str(x.get("Họ và tên") or ""),
                    "ngay_sinh": str(x.get("Ngày tháng năm sinh") or ""),
                    "noi_cong_tac": str(x.get("Nơi công tác") or ""),
                    "chuc_danh": str(x.get("Chức danh") or ""),
                    "trinh_do": str(x.get("Trình độ chuyên môn") or ""),
                    "noi_dung_ho_tro": str(x.get("Nội dung công việc hỗ trợ") or ""),
                }
                for x in dsg
                if isinstance(x, dict)
            ] or out["mau_02"]["danh_sach_tham_gia"]
        m02nk = m02.get("Ngày ký") if isinstance(m02.get("Ngày ký"), dict) else {}
        out["mau_02"]["ngay_ky"]["ngay"] = str(m02nk.get("Ngày") or "")
        out["mau_02"]["ngay_ky"]["thang"] = str(m02nk.get("Tháng") or "")
        out["mau_02"]["ngay_ky"]["nam"] = str(m02nk.get("Năm") or "")
        out["mau_02"]["lanh_dao_don_vi"] = str(m02.get("Xác nhận của lãnh đạo Đơn vị") or "")
        out["mau_02"]["tac_gia_sang_kien"] = str(m02.get("Tác giả sáng kiến (Ký, ghi rõ họ tên)") or "")

    m03 = official.get("MẪU SỐ 03 - BẢN XÁC NHẬN TỶ LỆ (%) ĐÓNG GÓP VÀO VIỆC TẠO RA SÁNG KIẾN")
    if isinstance(m03, dict):
        m03nk = m03.get("Ngày ký") if isinstance(m03.get("Ngày ký"), dict) else {}
        out["mau_03"]["ngay_ky"]["ngay"] = str(m03nk.get("Ngày") or "")
        out["mau_03"]["ngay_ky"]["thang"] = str(m03nk.get("Tháng") or "")
        out["mau_03"]["ngay_ky"]["nam"] = str(m03nk.get("Năm") or "")
        out["mau_03"]["ten_sang_kien"] = str(m03.get("1. Tên sáng kiến") or "")
        out["mau_03"]["tac_gia_chinh"] = str(
            m03.get("2. Tác giả chính/Đại diện nhóm tác giả sáng kiến") or ""
        )
        out["mau_03"]["chuc_vu_don_vi"] = str(m03.get("Chức vụ, đơn vị công tác") or "")
        tyle = m03.get("Tỷ lệ đóng góp")
        if isinstance(tyle, list) and tyle:
            out["mau_03"]["ty_le_dong_gop"] = [
                {
                    "stt": str(x.get("STT") or ""),
                    "ho_ten": str(x.get("Họ và tên") or ""),
                    "don_vi": str(x.get("Đơn vị công tác") or ""),
                    "phan_tram": str(x.get("% đóng góp") or ""),
                    "chu_ky": str(x.get("Chữ ký xác nhận") or ""),
                }
                for x in tyle
                if isinstance(x, dict)
            ] or out["mau_03"]["ty_le_dong_gop"]
        out["mau_03"]["tac_gia_chinh_ky"] = str(
            m03.get("Tác giả chính/Đại diện nhóm tác giả sáng kiến (chữ ký và ghi rõ họ tên)")
            or ""
        )

    m04 = official.get("MẪU SỐ 04 - PHIẾU ĐÁNH GIÁ SÁNG KIẾN")
    if isinstance(m04, dict):
        out["mau_04"]["ten_sang_kien"] = str(m04.get("1. Tên sáng kiến") or "")
        out["mau_04"]["tac_gia"] = str(m04.get("2. Tác giả/đồng tác giả sáng kiến") or "")
        out["mau_04"]["chuc_vu_don_vi"] = str(m04.get("Chức vụ, đơn vị công tác") or "")
        ndg = m04.get("3. Nội dung đánh giá") if isinstance(m04.get("3. Nội dung đánh giá"), dict) else {}
        tm = ndg.get("Tính mới (Tối đa 40 điểm)") if isinstance(ndg.get("Tính mới (Tối đa 40 điểm)"), dict) else {}
        th = (
            ndg.get("Tính hiệu quả (Tối đa 60 điểm)")
            if isinstance(ndg.get("Tính hiệu quả (Tối đa 60 điểm)"), dict)
            else {}
        )
        out["mau_04"]["tinh_moi"]["nhan_xet"] = str(tm.get("Nhận xét") or "")
        out["mau_04"]["tinh_moi"]["diem"] = str(tm.get("Điểm chấm") or "")
        out["mau_04"]["tinh_hieu_qua"]["nhan_xet"] = str(th.get("Nhận xét") or "")
        out["mau_04"]["tinh_hieu_qua"]["diem"] = str(th.get("Điểm chấm") or "")
        out["mau_04"]["tong_cong"] = str(ndg.get("Tổng cộng") or "")
        out["mau_04"]["ket_luan"] = str(m04.get("Kết luận") or "")
        m4nk = m04.get("Ngày ký") if isinstance(m04.get("Ngày ký"), dict) else {}
        out["mau_04"]["ngay_ky"]["ngay"] = str(m4nk.get("Ngày") or "")
        out["mau_04"]["ngay_ky"]["thang"] = str(m4nk.get("Tháng") or "")
        out["mau_04"]["ngay_ky"]["nam"] = str(m4nk.get("Năm") or "")
        out["mau_04"]["thanh_vien_hoi_dong"] = str(
            m04.get("Thành viên Hội đồng (Ký, ghi rõ họ tên)") or ""
        )

    bck = official.get("BẢN CAM KẾT")
    if isinstance(bck, dict):
        bnk = bck.get("Ngày ký") if isinstance(bck.get("Ngày ký"), dict) else {}
        out["ban_cam_ket"]["ngay_ky"]["ngay"] = str(bnk.get("Ngày") or "")
        out["ban_cam_ket"]["ngay_ky"]["thang"] = str(bnk.get("Tháng") or "")
        out["ban_cam_ket"]["ngay_ky"]["nam"] = str(bnk.get("Năm") or "")
        i1 = bck.get("I. THÔNG TIN CHỦ THỂ CAM KẾT")
        if isinstance(i1, dict):
            out["ban_cam_ket"]["tac_gia_dang_ky"] = str(i1.get("Tác giả đăng ký sáng kiến") or "")
            out["ban_cam_ket"]["cccd"] = str(i1.get("CCCD/Hộ chiếu số") or "")
            out["ban_cam_ket"]["don_vi"] = str(i1.get("Đơn vị") or "")
            ten_raw = i1.get(
                "Tên Bài báo trong nước/quốc tế là sản phẩm của nhiệm vụ NCKH"
            ) or i1.get("Tên Bài báo trong nước/quốc tế")
            out["ban_cam_ket"]["ten_bai_bao"] = str(ten_raw or "")
            out["ban_cam_ket"]["nam_xet"] = str(i1.get("Năm xét công nhận sáng kiến") or "")
            vt = i1.get("Vai trò đối với bài báo (☑ vào ô tương ứng)")
            if isinstance(vt, dict):
                out["ban_cam_ket"]["vai_tro"]["tac_gia_chinh"] = bool(
                    vt.get("Tác giả chính Bài báo trong nước/quốc tế là sản phẩm của nhiệm vụ NCKH")
                )
                out["ban_cam_ket"]["vai_tro"]["dong_tac_gia"] = bool(
                    vt.get("Đồng tác giả Bài báo trong nước/quốc tế là sản phẩm của nhiệm vụ NCKH")
                )
        ii = bck.get("II. CAM KẾT NỘI DUNG (☑ vào ô tương ứng)")
        if isinstance(ii, dict):
            # Keys must match `bieu_mau_sang_kien_template.json` (numbered subsections). Legacy unnumbered keys kept as fallback.
            quyen = ii.get("1. Quyền sở hữu đối với bài báo trong nước/quốc tế")
            if not isinstance(quyen, dict):
                quyen = ii.get("Quyền sở hữu đối với bài báo trong nước/quốc tế")
            if isinstance(quyen, dict):
                kq1_full = (
                    "Tôi là chủ sở hữu hợp pháp của bài báo hoặc được chủ sở hữu/đồng chủ sở hữu đồng ý cho sử dụng bài báo có tên nêu trên làm sản phẩm đăng ký xét công nhận sáng kiến – cải tiến kỹ thuật tại ĐHYD"
                )
                kq1_short = "Tôi là chủ sở hữu hợp pháp của bài báo hoặc được chủ sở hữu/đồng chủ sở hữu đồng ý cho sử dụng bài báo"
                kq2_full = (
                    "Trường hợp bài báo là sản phẩm của nhiệm vụ NCKH: chủ sở hữu bài báo (cơ quan) đồng ý cho tác giả/nhóm tác giả sử dụng bài báo có tên nêu trên để đăng ký xét công nhận sáng kiến – cải tiến kỹ thuật tại ĐHYD"
                )
                kq2_short = "Trường hợp bài báo là sản phẩm của nhiệm vụ NCKH: chủ sở hữu bài báo (cơ quan) đồng ý cho tác giả/nhóm tác giả sử dụng"
                out["ban_cam_ket"]["cam_ket"]["quyen_so_huu_1"] = bool(
                    quyen.get(kq1_full) or quyen.get(kq1_short)
                )
                out["ban_cam_ket"]["cam_ket"]["quyen_so_huu_2"] = bool(
                    quyen.get(kq2_full) or quyen.get(kq2_short)
                )
            dt = ii.get("2. Đồng thuận của đồng tác giả bài báo trong nước/quốc tế")
            if not isinstance(dt, dict):
                dt = ii.get("Đồng thuận của đồng tác giả bài báo trong nước/quốc tế")
            if isinstance(dt, dict):
                kd_full = (
                    "Tất cả đồng tác giả đã biết, đồng ý và ký xác nhận cho phép Tác giả đăng ký sáng kiến được sử dụng bài báo có tên nêu trên để đăng ký xét công nhận sáng kiến – cải tiến kỹ thuật tại ĐHYD"
                )
                kd_short = "Tất cả đồng tác giả đã biết, đồng ý và ký xác nhận cho phép Tác giả đăng ký sáng kiến"
                out["ban_cam_ket"]["cam_ket"]["dong_thuan"] = bool(
                    dt.get(kd_full) or dt.get(kd_short)
                )
            uy = ii.get("3. Cam kết bài báo trong nước/quốc tế uy tín")
            if not isinstance(uy, dict):
                uy = ii.get("Cam kết bài báo trong nước/quốc tế uy tín")
            if isinstance(uy, dict):
                ku_full = (
                    "Cá nhân đăng ký xét công nhận sáng kiến – cải tiến kỹ thuật tại ĐHYD đối với bài báo trong nước/quốc tế cam kết bài báo không thuộc 'Tạp chí săn mồi'. Tôi xin chịu trách nhiệm kiểm tra, đối chiếu và cung cấp bằng chứng khi được yêu cầu"
                )
                ku_short = "Cam kết bài báo không thuộc 'Tạp chí săn mồi'"
                out["ban_cam_ket"]["cam_ket"]["bai_bao_uy_tin"] = bool(
                    uy.get(ku_full) or uy.get(ku_short)
                )
            tt = ii.get("4. Tuân thủ pháp luật sở hữu trí tuệ")
            if not isinstance(tt, dict):
                tt = ii.get("Tuân thủ pháp luật sở hữu trí tuệ")
            if isinstance(tt, dict):
                kt_full = (
                    "Tôi cam kết rằng việc sử dụng bài báo đăng ký xét công nhận sáng kiến tại ĐHYD sẽ không gây tranh chấp về: quyền tác giả/quyền liên quan, quyền sở hữu công nghiệp, tiết lộ bí mật kinh doanh, vi phạm bảo mật dữ liệu của bất kỳ bên thứ ba nào. Tôi chịu trách nhiệm trước pháp luật về tính trung thực, hợp pháp của hồ sơ"
                )
                kt_short = "Cam kết việc sử dụng bài báo sẽ không gây tranh chấp về quyền tác giả, sở hữu trí tuệ, bí mật kinh doanh, bảo mật dữ liệu"
                out["ban_cam_ket"]["cam_ket"]["tuan_thu_phap_luat"] = bool(
                    tt.get(kt_full) or tt.get(kt_short)
                )
        out["ban_cam_ket"]["nguoi_cam_ket"] = str(
            bck.get("Người cam kết (Ký tên, ghi rõ họ tên)") or ""
        )

    bx = official.get("BẢN XÁC NHẬN TÀI LIỆU THAM KHẢO (2.2.2)")
    if isinstance(bx, dict):
        bnk = bx.get("Ngày ký") if isinstance(bx.get("Ngày ký"), dict) else {}
        out["reference_material_honesty"]["ngay_ky"]["ngay"] = str(bnk.get("Ngày") or "")
        out["reference_material_honesty"]["ngay_ky"]["thang"] = str(bnk.get("Tháng") or "")
        out["reference_material_honesty"]["ngay_ky"]["nam"] = str(bnk.get("Năm") or "")
        i1 = bx.get("I. THÔNG TIN ĐĂNG KÝ")
        if isinstance(i1, dict):
            out["reference_material_honesty"]["tac_gia_dang_ky"] = str(i1.get("Tác giả đăng ký sáng kiến") or "")
            out["reference_material_honesty"]["cccd"] = str(i1.get("CCCD/Hộ chiếu số") or "")
            out["reference_material_honesty"]["don_vi"] = str(i1.get("Đơn vị") or "")
            out["reference_material_honesty"]["ten_tai_lieu"] = str(
                i1.get("Tên tài liệu tham khảo (theo Quyết định xuất bản)") or ""
            )
            out["reference_material_honesty"]["nam_xet"] = str(i1.get("Năm xét công nhận sáng kiến") or "")
        ii = bx.get("II. XÁC NHẬN VÀ CAM KẾT (☑ vào ô tương ứng)")
        if isinstance(ii, dict):
            _RM_ONE_FULL = (
                "Tôi cam đoan các thông tin kê khai và minh chứng đính kèm đối với tài liệu tham khảo là trung thực, đúng sự thật và phù hợp với Quyết định xuất bản trong giai đoạn quy định (15/4/2025–15/4/2026)."
            )
            _RM_TWO_FULL = (
                "Tôi hoàn toàn chịu trách nhiệm trước pháp luật và trước nhà trường về tính hợp pháp của tài liệu và nội dung đăng ký."
            )
            _RM_THREE_FULL = "Tôi đồng ý bổ sung hoặc chỉnh sửa hồ sơ khi được yêu cầu."
            s1 = ii.get("1. Trung thực thông tin và minh chứng")
            if isinstance(s1, dict):
                out["reference_material_honesty"]["cam_ket"]["thong_tin_trung_thuc"] = bool(s1.get(_RM_ONE_FULL))
            s2 = ii.get("2. Trách nhiệm pháp luật")
            if isinstance(s2, dict):
                out["reference_material_honesty"]["cam_ket"]["trach_nhiem_phap_luat"] = bool(s2.get(_RM_TWO_FULL))
            s3 = ii.get("3. Bổ sung hồ sơ khi được yêu cầu")
            if isinstance(s3, dict):
                out["reference_material_honesty"]["cam_ket"]["bo_sung_khi_yeu_cau"] = bool(s3.get(_RM_THREE_FULL))
        out["reference_material_honesty"]["nguoi_cam_ket"] = str(
            bx.get("Người cam kết (Ký tên, ghi rõ họ tên)") or ""
        )

    dj = official.get("BẢN XÁC NHẬN BÀI BÁO TRONG NƯỚC (2.1.2)")
    if isinstance(dj, dict):
        dnk = dj.get("Ngày ký") if isinstance(dj.get("Ngày ký"), dict) else {}
        out["research_domestic_honesty"]["ngay_ky"]["ngay"] = str(dnk.get("Ngày") or "")
        out["research_domestic_honesty"]["ngay_ky"]["thang"] = str(dnk.get("Tháng") or "")
        out["research_domestic_honesty"]["ngay_ky"]["nam"] = str(dnk.get("Năm") or "")
        _dj_sub = (
            "Tiêu đề phụ (Áp dụng đối với cá nhân đăng ký minh chứng là bài báo tạp chí trong nước nhóm 2.1.2)"
        )
        out["research_domestic_honesty"]["tieu_de_phu"] = str(dj.get(_dj_sub) or "")
        i1d = dj.get("I. THÔNG TIN ĐĂNG KÝ")
        if isinstance(i1d, dict):
            out["research_domestic_honesty"]["tac_gia_dang_ky"] = str(i1d.get("Tác giả đăng ký sáng kiến") or "")
            out["research_domestic_honesty"]["cccd"] = str(i1d.get("CCCD/Hộ chiếu số") or "")
            out["research_domestic_honesty"]["don_vi"] = str(i1d.get("Đơn vị") or "")
            out["research_domestic_honesty"]["ten_bai_bao"] = str(
                i1d.get("Tên bài báo (tạp chí trong nước, giai đoạn xuất bản quy định)") or ""
            )
            out["research_domestic_honesty"]["nam_xet"] = str(i1d.get("Năm xét công nhận sáng kiến") or "")
        iid = dj.get("II. XÁC NHẬN VÀ CAM KẾT (☑ vào ô tương ứng)")
        if isinstance(iid, dict):
            _DJ_ONE_FULL = (
                "Tôi cam đoan các thông tin kê khai và minh chứng đính kèm đối với bài báo trên tạp chí trong nước là trung thực, đúng sự thật và phù hợp với thời điểm xuất bản trong giai đoạn quy định (15/4/2025–15/4/2026)."
            )
            _DJ_TWO_FULL = (
                "Tôi hoàn toàn chịu trách nhiệm trước pháp luật và trước nhà trường về tính hợp pháp của bài báo và nội dung đăng ký."
            )
            _DJ_THREE_FULL = "Tôi đồng ý bổ sung hoặc chỉnh sửa hồ sơ khi được yêu cầu."
            d1 = iid.get("1. Trung thực thông tin và minh chứng")
            if isinstance(d1, dict):
                out["research_domestic_honesty"]["cam_ket"]["thong_tin_trung_thuc"] = bool(d1.get(_DJ_ONE_FULL))
            d2 = iid.get("2. Trách nhiệm pháp luật")
            if isinstance(d2, dict):
                out["research_domestic_honesty"]["cam_ket"]["trach_nhiem_phap_luat"] = bool(d2.get(_DJ_TWO_FULL))
            d3 = iid.get("3. Bổ sung hồ sơ khi được yêu cầu")
            if isinstance(d3, dict):
                out["research_domestic_honesty"]["cam_ket"]["bo_sung_khi_yeu_cau"] = bool(d3.get(_DJ_THREE_FULL))
        out["research_domestic_honesty"]["nguoi_cam_ket"] = str(
            dj.get("Người cam kết (Ký tên, ghi rõ họ tên)") or ""
        )

    return out

