"""
Build a DOCX template with docxtpl (Jinja2) placeholders.
The template mirrors the original 'Biểu mẫu kèm TB' structure:
 - Trang bìa
 - Mẫu số 01: Báo cáo mô tả sáng kiến
 - Mẫu số 02: Đơn đề nghị công nhận sáng kiến
 - Mẫu số 03: Bản xác nhận tỷ lệ đóng góp
 - Bản cam kết
"""
from docx import Document
from docx.shared import Pt, Cm, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_BREAK
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

OUTPUT = "/home/claude/template_project/template_sang_kien.docx"

# Page margins — edit these to retune layout (python-docx: Cm / Inches / Pt)
MARGIN_TOP_CM = 2.0
MARGIN_BOTTOM_CM = 2.0
MARGIN_LEFT_IN = 0.79
MARGIN_RIGHT_IN = 0.49


# ---------- helpers ----------
def apply_page_margins(doc: Document) -> None:
    """Apply section margins to every section in the document."""
    for section in doc.sections:
        section.top_margin = Cm(MARGIN_TOP_CM)
        section.bottom_margin = Cm(MARGIN_BOTTOM_CM)
        section.left_margin = Inches(MARGIN_LEFT_IN)
        section.right_margin = Inches(MARGIN_RIGHT_IN)


def set_cell_border(cell, **kwargs):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = OxmlElement("w:tcBorders")
    for edge in ("top", "left", "bottom", "right"):
        if edge in kwargs:
            border = OxmlElement(f"w:{edge}")
            border.set(qn("w:val"), kwargs[edge].get("val", "single"))
            border.set(qn("w:sz"), str(kwargs[edge].get("sz", 4)))
            border.set(qn("w:color"), kwargs[edge].get("color", "000000"))
            tcBorders.append(border)
    tcPr.append(tcBorders)


def set_paragraph_indent(paragraph, *, left=0, right=0):
    """Set paragraph left/right indents in twips."""
    p = paragraph._p
    pPr = p.get_or_add_pPr()
    ind = pPr.find(qn("w:ind"))
    if ind is None:
        ind = OxmlElement("w:ind")
        pPr.append(ind)
    ind.set(qn("w:left"), str(left))
    ind.set(qn("w:right"), str(right))


def set_cell_margins(cell, *, top=0, right=0, bottom=0, left=0):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcMar = tcPr.find(qn("w:tcMar"))
    if tcMar is None:
        tcMar = OxmlElement("w:tcMar")
        tcPr.append(tcMar)
    for side, value in (("top", top), ("right", right), ("bottom", bottom), ("left", left)):
        node = tcMar.find(qn(f"w:{side}"))
        if node is None:
            node = OxmlElement(f"w:{side}")
            tcMar.append(node)
        node.set(qn("w:w"), str(value))
        node.set(qn("w:type"), "dxa")


def add_para(doc, text="", bold=False, italic=False, align=None, size=13, before=0, after=0):
    p = doc.add_paragraph()
    if align == "center":
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    elif align == "right":
        p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    elif align == "justify":
        p.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
    pf = p.paragraph_format
    pf.space_before = Pt(before)
    pf.space_after = Pt(after)
    if text:
        r = p.add_run(text)
        r.bold = bold
        r.italic = italic
        r.font.size = Pt(size)
        r.font.name = "Times New Roman"
    return p


def add_run(p, text, bold=False, italic=False, size=13):
    r = p.add_run(text)
    r.bold = bold
    r.italic = italic
    r.font.size = Pt(size)
    r.font.name = "Times New Roman"
    return r


def page_break(doc):
    p = doc.add_paragraph()
    p.add_run().add_break(WD_BREAK.PAGE)


def set_cell_text(cell, text, bold=False, italic=False, align=None, size=13):
    cell.text = ""
    p = cell.paragraphs[0]
    if align == "center":
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    elif align == "right":
        p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    elif align == "justify":
        p.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
    r = p.add_run(text)
    r.bold = bold
    r.italic = italic
    r.font.size = Pt(size)
    r.font.name = "Times New Roman"
    return p


def add_cell_para(cell, text, bold=False, italic=False, align=None, size=13):
    p = cell.add_paragraph()
    if align == "center":
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    elif align == "right":
        p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    r = p.add_run(text)
    r.bold = bold
    r.italic = italic
    r.font.size = Pt(size)
    r.font.name = "Times New Roman"
    return p


# ---------- build ----------
doc = Document()

# Default font + page margins
style = doc.styles["Normal"]
style.font.name = "Times New Roman"
style.font.size = Pt(13)
apply_page_margins(doc)


# =====================================================================
# TRANG BÌA  (rendered twice: outer + inner, identical content)
# =====================================================================
def render_cover(doc):
    add_para(doc, "BỘ Y TẾ", bold=False, align="center", size=13, before=20)
    add_para(doc, "ĐẠI HỌC Y DƯỢC\nTHÀNH PHỐ HỒ CHÍ MINH", bold=True, align="center", size=11)
    add_para(doc, "===== ===== =====", bold=True, align="center", size=13, after=30)

    add_para(doc, "BÁO CÁO MÔ TẢ SÁNG KIẾN", bold=True, align="center", size=18, before=40, after=40)

    # Tên sáng kiến
    p = add_para(doc, "", align="center", before=20, after=10)
    add_run(p, "Tên sáng kiến (Tiếng Việt): ", bold=True, size=14)
    add_run(p, "{{ trang_bia.ten_sang_kien }}", bold=True, size=14)

    # Tác giả
    p = add_para(doc, "", align="center", before=20, after=10)
    add_run(p, "Tác giả/nhóm tác giả sáng kiến: ", bold=True, size=14)
    add_run(p, "{{ trang_bia.tac_gia }}", size=14)

    # Đơn vị
    p = add_para(doc, "", align="center", before=20, after=10)
    add_run(p, "Đơn vị công tác: ", bold=True, size=14)
    add_run(p, "{{ trang_bia.don_vi }}", size=14)

    # Liên hệ
    p = add_para(doc, "", align="center", before=20, after=10)
    add_run(p, "Thông tin liên hệ (Điện thoại, Email): ", bold=True, size=14)
    add_run(p, "{{ trang_bia.thong_tin_lien_he }}", size=14)

    # Năm
    p = add_para(doc, "", align="center", before=60, after=10)
    add_run(p, "Tp. Hồ Chí Minh – Năm {{ trang_bia.nam }}", bold=True, size=14)


render_cover(doc)
page_break(doc)
render_cover(doc)
page_break(doc)


# =====================================================================
# MẪU SỐ 01 – BÁO CÁO MÔ TẢ SÁNG KIẾN
# =====================================================================
add_para(doc, "Mẫu số 01", italic=True, align="right", size=12)
add_para(doc, "BÁO CÁO MÔ TẢ SÁNG KIẾN", bold=True, align="center", size=16, before=12, after=12)

# 1. Mở đầu
p = add_para(doc, "")
add_run(p, "1. Mở đầu ", bold=True)
add_run(p, "(Giới thiệu về những vấn đề liên quan đến sáng kiến ở trong và ngoài đơn vị/trường mà tác giả đã biết, những khó khăn/bất cập/hạn chế tại đơn vị/trường liên quan đến nội dung của sáng kiến; từ đó nêu ra sự cần thiết phải thực hiện sáng kiến):", italic=True)
add_para(doc, "{{ mau_01.mo_dau }}", align="justify")

# 2. Tên sáng kiến
p = add_para(doc, "")
add_run(p, "2. Tên sáng kiến (tên quy trình, giải pháp, phương pháp): ", bold=True)
add_run(p, "{{ mau_01.ten_sang_kien }}")

# 3. Lĩnh vực áp dụng
p = add_para(doc, "")
add_run(p, "3. Lĩnh vực áp dụng của sáng kiến ", bold=True)
add_run(p, "(ví dụ: cải cách hành chính, quản lý giáo dục, bảo vệ môi trường, …): ", italic=True)
add_run(p, "{{ mau_01.linh_vuc_ap_dung }}")

# 4. Mô tả sáng kiến
add_para(doc, "4. Mô tả sáng kiến:", bold=True)

# 4.1
p = add_para(doc, "")
add_run(p, "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 ", bold=True)
add_run(p, "(nêu hiện trạng trước khi áp dụng giải pháp mới/chưa có sáng kiến, phân tích ưu nhược điểm của giải pháp cũ để cho thấy sự cần thiết của việc đề xuất giải pháp mới để khắc phục nhược điểm của giải pháp cũ):", italic=True)
add_para(doc, "{{ mau_01.tinh_trang_da_biet }}", align="justify")

# 4.2
add_para(doc, "4.2. Nội dung giải pháp đề nghị công nhận là sáng kiến:", bold=True)

p = add_para(doc, "")
add_run(p, "- Mục đích của sáng kiến (nêu vấn đề cần giải quyết): ", bold=True)
add_run(p, "{{ mau_01.muc_dich }}")

p = add_para(doc, "")
add_run(p, "- Về nội dung của sáng kiến: ", bold=True)
add_run(p, "Mô tả ngắn gọn, đầy đủ và rõ ràng:", italic=True)

add_para(doc, "+ Các bước thực hiện giải pháp:", bold=True)
add_para(doc, "{{ mau_01.cac_buoc_thuc_hien }}", align="justify")

add_para(doc, "+ Các điều kiện cần thiết để áp dụng giải pháp:", bold=True)
add_para(doc, "{{ mau_01.dieu_kien_ap_dung }}", align="justify")

p = add_para(doc, "")
add_run(p, "+ Lĩnh vực áp dụng: ", bold=True)
add_run(p, "{{ mau_01.linh_vuc_ap_dung_2 }}")

add_para(doc, "+ Kết quả thu được:", bold=True)
add_para(doc, "{{ mau_01.ket_qua_thu_duoc }}", align="justify")

add_para(doc, "+ Danh sách đơn vị/cá nhân đã tham gia áp dụng thử hoặc lần đầu (nếu có):", bold=True)

# Table for danh sách áp dụng  (3-row pattern for {%tr %} loops)
tbl = doc.add_table(rows=4, cols=4)
tbl.style = "Table Grid"
hdr = tbl.rows[0].cells
for i, h in enumerate(["TT", "Tên tổ chức/cá nhân", "Địa chỉ", "Lĩnh vực áp dụng sáng kiến"]):
    set_cell_text(hdr[i], h, bold=True, align="center")
# marker row: {%tr for %}
set_cell_text(tbl.rows[1].cells[0], "{%tr for item in mau_01.danh_sach_ap_dung %}")
# data row
set_cell_text(tbl.rows[2].cells[0], "{{ item.tt }}", align="center")
set_cell_text(tbl.rows[2].cells[1], "{{ item.ten_to_chuc }}")
set_cell_text(tbl.rows[2].cells[2], "{{ item.dia_chi }}")
set_cell_text(tbl.rows[2].cells[3], "{{ item.linh_vuc }}")
# marker row: {%tr endfor %}
set_cell_text(tbl.rows[3].cells[0], "{%tr endfor %}")

# Tính mới
p = add_para(doc, "", before=12)
add_run(p, "- Về tính mới của sáng kiến:", bold=True)
add_para(doc, "{{ mau_01.tinh_moi }}", align="justify")

# Tính hiệu quả
p = add_para(doc, "", before=12)
add_run(p, "- Về tính hiệu quả: ", bold=True)
add_run(p, "So sánh hiệu quả về mặt kinh tế, xã hội, khoa học thu được hoặc dự kiến thu được khi áp dụng sáng kiến (phải có số liệu cụ thể, căn cứ để tính toán, kiểm tra, đánh giá):", italic=True)

hieu_qua_fields = [
    ("+ Tạo ra lợi ích kinh tế: ", "loi_ich_kinh_te"),
    ("+ Đem lại hiệu quả trong giảng dạy: ", "hieu_qua_giang_day"),
    ("+ Tăng năng suất lao động: ", "tang_nang_suat"),
    ("+ Nâng cao hiệu quả công việc: ", "nang_cao_hieu_qua"),
    ("+ Nâng cao chất lượng công việc, dịch vụ: ", "nang_cao_chat_luong"),
    ("+ Giảm chi phí: ", "giam_chi_phi"),
    ("+ Cải thiện môi trường, điều kiện học tập, làm việc, sống: ", "cai_thien_moi_truong"),
    ("+ Bảo vệ sức khỏe: ", "bao_ve_suc_khoe"),
    ("+ Đảm bảo an toàn lao động, PCCC: ", "an_toan_lao_dong"),
    ("+ Nâng cao khả năng, trình độ, nhận thức, trách nhiệm: ", "nang_cao_nhan_thuc"),
]
for label, key in hieu_qua_fields:
    p = add_para(doc, "")
    add_run(p, label, bold=True)
    add_run(p, "{{ mau_01.tinh_hieu_qua." + key + " }}")

# 6. Bảo mật
p = add_para(doc, "", before=12)
add_run(p, "6. Những thông tin cần được bảo mật (nếu có): ", bold=True)
add_run(p, "{{ mau_01.thong_tin_bao_mat }}")

# Chữ ký Mẫu 01
add_para(doc, "")
sig = doc.add_table(rows=1, cols=2)
sig.autofit = True
left, right = sig.rows[0].cells
set_cell_text(left, "LÃNH ĐẠO ĐƠN VỊ", bold=True, align="center")
add_cell_para(left, "(Ký, ghi rõ họ tên)", italic=True, align="center")
add_cell_para(left, "")
add_cell_para(left, "")
add_cell_para(left, "{{ mau_01.lanh_dao_don_vi }}", bold=True, align="center")

set_cell_text(right, "Tp. Hồ Chí Minh, ngày {{ mau_01.ngay_ky.ngay }} tháng {{ mau_01.ngay_ky.thang }} năm {{ mau_01.ngay_ky.nam }}", italic=True, align="center")
add_cell_para(right, "Tác giả chính / Đại diện nhóm tác giả sáng kiến", bold=True, align="center")
add_cell_para(right, "(chữ ký và ghi rõ họ tên)", italic=True, align="center")
add_cell_para(right, "")
add_cell_para(right, "{{ mau_01.tac_gia_sang_kien }}", bold=True, align="center")
# remove borders on signature table
for row in sig.rows:
    for cell in row.cells:
        set_cell_border(cell,
                        top={"val": "nil"}, bottom={"val": "nil"},
                        left={"val": "nil"}, right={"val": "nil"})

page_break(doc)


# =====================================================================
# MẪU SỐ 02 – ĐƠN ĐỀ NGHỊ CÔNG NHẬN SÁNG KIẾN
# =====================================================================
# Header block (institution | CHXHCN VN)
hdr = doc.add_table(rows=1, cols=2)
p = set_cell_text(hdr.rows[0].cells[0], "ĐẠI HỌC Y DƯỢC\nTHÀNH PHỐ HỒ CHÍ MINH", bold=True, align="center", size=11)
set_paragraph_indent(p, left=-150, right=0)
p = add_cell_para(hdr.rows[0].cells[0], "{{ mau_02.don_vi|upper }}", bold=False, align="center", size=11)
set_paragraph_indent(p, left=-150, right=0)
p = set_cell_text(hdr.rows[0].cells[1], "CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM", bold=True, align="left", size=10.7)
set_paragraph_indent(p, left=-150, right=0)
add_cell_para(hdr.rows[0].cells[1], "Độc lập - Tự do - Hạnh phúc", bold=True, align="center", size=12)
set_cell_margins(hdr.rows[0].cells[1], top=0, right=0, bottom=0, left=0)
for row in hdr.rows:
    for cell in row.cells:
        set_cell_border(cell, top={"val": "nil"}, bottom={"val": "nil"}, left={"val": "nil"}, right={"val": "nil"})

add_para(doc, "Mẫu số 02", italic=True, align="right", size=12, before=12)
add_para(doc, "ĐƠN ĐỀ NGHỊ CÔNG NHẬN SÁNG KIẾN", bold=True, align="center", size=16, before=6, after=6)
add_para(doc, "Kính gửi: Hội đồng sáng kiến Đại học Y Dược TP. Hồ Chí Minh", italic=True, align="center")

add_para(doc, "Tên tôi (chúng tôi) là:", before=12)

# Tác giả table (3-row pattern for {%tr %} loop)
t = doc.add_table(rows=4, cols=7)
t.style = "Table Grid"
headers = ["STT", "Họ và tên", "Ngày tháng năm sinh", "Nơi công tác", "Chức danh", "Trình độ chuyên môn", "Tỷ lệ (%) đóng góp"]
for i, h in enumerate(headers):
    set_cell_text(t.rows[0].cells[i], h, bold=True, align="center", size=11)
set_cell_text(t.rows[1].cells[0], "{%tr for item in mau_02.danh_sach_tac_gia %}", size=11)
r = t.rows[2].cells
set_cell_text(r[0], "{{ item.stt }}", align="center", size=11)
set_cell_text(r[1], "{{ item.ho_ten }}", size=11)
set_cell_text(r[2], "{{ item.ngay_sinh }}", align="center", size=11)
set_cell_text(r[3], "{{ item.noi_cong_tac }}", size=11)
set_cell_text(r[4], "{{ item.chuc_danh }}", size=11)
set_cell_text(r[5], "{{ item.trinh_do }}", size=11)
set_cell_text(r[6], "{{ item.ty_le }}", align="center", size=11)
set_cell_text(t.rows[3].cells[0], "{%tr endfor %}", size=11)

# Fields
p = add_para(doc, "", before=12)
add_run(p, "- Là tác giả (nhóm tác giả) đề nghị xét công nhận sáng kiến: ")
add_run(p, "\u201C{{ mau_02.ten_sang_kien }}\u201D", bold=True)

p = add_para(doc, "")
add_run(p, "- Chủ đầu tư tạo ra sáng kiến: ")
add_run(p, "{{ mau_02.chu_dau_tu }}")

p = add_para(doc, "")
add_run(p, "- Lĩnh vực áp dụng sáng kiến: ")
add_run(p, "{{ mau_02.linh_vuc_ap_dung }}")

p = add_para(doc, "")
add_run(p, "- Ngày sáng kiến được áp dụng: ")
add_run(p, "{{ mau_02.ngay_ap_dung }}")

add_para(doc, "- Nội dung của sáng kiến:", bold=True)
add_para(doc, "{{ mau_02.noi_dung }}", align="justify")

add_para(doc, "- Sáng kiến này là:", bold=True, before=6)
add_para(doc, "{% if mau_02.phan_loai.giai_phap_ky_thuat %}☑{% else %}☐{% endif %} 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 Đại học Y Dược TP.HCM")
add_para(doc, "{% if mau_02.phan_loai.sang_kien_tu_nckh %}☑{% else %}☐{% endif %} 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ế")
add_para(doc, "{% if mau_02.phan_loai.sang_kien_tu_sach %}☑{% else %}☐{% endif %} 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")

p = add_para(doc, "", before=6)
add_run(p, "- Những thông tin cần được bảo mật (nếu có): ", bold=True)
add_run(p, "{{ mau_02.thong_tin_bao_mat }}")

add_para(doc, "- Các điều kiện cần thiết để áp dụng sáng kiến:", bold=True)
add_para(doc, "{{ mau_02.dieu_kien_ap_dung }}", align="justify")

add_para(doc, "- Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng sáng kiến theo ý kiến của tác giả:", bold=True)
add_para(doc, "{{ mau_02.danh_gia_tac_gia }}", align="justify")

add_para(doc, "- Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng sáng kiến theo ý kiến của tổ chức, cá nhân đã tham gia áp dụng sáng kiến lần đầu, kể cả áp dụng thử (nếu có):", bold=True)
add_para(doc, "{{ mau_02.danh_gia_to_chuc }}", align="justify")

add_para(doc, "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 (nếu có):", bold=True, before=6)

t2 = doc.add_table(rows=4, cols=7)
t2.style = "Table Grid"
headers2 = ["Số TT", "Họ và tên", "Ngày tháng năm sinh", "Nơi công tác", "Chức danh", "Trình độ chuyên môn", "Nội dung công việc hỗ trợ"]
for i, h in enumerate(headers2):
    set_cell_text(t2.rows[0].cells[i], h, bold=True, align="center", size=11)
set_cell_text(t2.rows[1].cells[0], "{%tr for item in mau_02.danh_sach_tham_gia %}", size=11)
r2 = t2.rows[2].cells
set_cell_text(r2[0], "{{ item.stt }}", align="center", size=11)
set_cell_text(r2[1], "{{ item.ho_ten }}", size=11)
set_cell_text(r2[2], "{{ item.ngay_sinh }}", align="center", size=11)
set_cell_text(r2[3], "{{ item.noi_cong_tac }}", size=11)
set_cell_text(r2[4], "{{ item.chuc_danh }}", size=11)
set_cell_text(r2[5], "{{ item.trinh_do }}", size=11)
set_cell_text(r2[6], "{{ item.noi_dung_ho_tro }}", size=11)
set_cell_text(t2.rows[3].cells[0], "{%tr endfor %}", size=11)

add_para(doc, "Tôi xin cam đoan mọi thông tin nêu trong đơn là trung thực, đúng sự thật và hoàn toàn chịu trách nhiệm trước pháp luật./.", before=12, align="justify")

add_para(doc, "TP. Hồ Chí Minh, ngày {{ mau_02.ngay_ky.ngay }} tháng {{ mau_02.ngay_ky.thang }} năm {{ mau_02.ngay_ky.nam }}", italic=True, align="right", before=12)

# signature table
sig2 = doc.add_table(rows=1, cols=2)
l2, r2c = sig2.rows[0].cells
set_cell_text(l2, "Xác nhận của lãnh đạo", bold=True, align="center")
add_cell_para(l2, "{{ mau_02.don_vi|upper }}", bold=False, align="center", size=11)
add_cell_para(l2, "")
add_cell_para(l2, "")
add_cell_para(l2, "{{ mau_02.lanh_dao_don_vi }}", bold=True, align="center")

set_cell_text(r2c, "Tác giả chính / Đại diện nhóm tác giả sáng kiến", bold=True, align="center")
add_cell_para(r2c, "(chữ ký và ghi rõ họ tên)", italic=True, align="center")
add_cell_para(r2c, "")
add_cell_para(r2c, "")
add_cell_para(r2c, "{{ mau_02.tac_gia_sang_kien }}", bold=True, align="center")
for row in sig2.rows:
    for cell in row.cells:
        set_cell_border(cell, top={"val": "nil"}, bottom={"val": "nil"}, left={"val": "nil"}, right={"val": "nil"})

page_break(doc)


# =====================================================================
# MẪU SỐ 03 – BẢN XÁC NHẬN TỶ LỆ (%) ĐÓNG GÓP
# =====================================================================
hdr3 = doc.add_table(rows=1, cols=2)
set_cell_text(hdr3.rows[0].cells[0], "BỘ Y TẾ", bold=False, align="center", size=12)
p = add_cell_para(hdr3.rows[0].cells[0], "ĐẠI HỌC Y DƯỢC\nTHÀNH PHỐ HỒ CHÍ MINH", bold=True, align="center", size=14)
set_paragraph_indent(p, left=-150, right=0)
p = set_cell_text(hdr3.rows[0].cells[1], "CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM", bold=True, align="left", size=10.7)
set_paragraph_indent(p, left=-150, right=0)
add_cell_para(hdr3.rows[0].cells[1], "Độc lập – Tự do – Hạnh phúc", bold=True, align="center", size=12)
set_cell_margins(hdr3.rows[0].cells[1], top=0, right=0, bottom=0, left=0)
for row in hdr3.rows:
    for cell in row.cells:
        set_cell_border(cell, top={"val": "nil"}, bottom={"val": "nil"}, left={"val": "nil"}, right={"val": "nil"})

add_para(doc, "Mẫu số 03", italic=True, align="right", size=12, before=12)
add_para(doc, "TP. Hồ Chí Minh, ngày {{ mau_03.ngay_ky.ngay }} tháng {{ mau_03.ngay_ky.thang }} năm {{ mau_03.ngay_ky.nam }}", italic=True, align="center")
add_para(doc, "BẢN XÁC NHẬN", bold=True, align="center", size=16, before=12)
add_para(doc, "TỶ LỆ (%) ĐÓNG GÓP VÀO VIỆC TẠO RA SÁNG KIẾN", bold=True, align="center", size=14, after=12)

p = add_para(doc, "")
add_run(p, "1. Tên sáng kiến: ", bold=True)
add_run(p, "{{ mau_03.ten_sang_kien }}")

p = add_para(doc, "")
add_run(p, "2. Tác giả chính / Đại diện nhóm tác giả sáng kiến: ", bold=True)
add_run(p, "{{ mau_03.tac_gia_chinh }}")

p = add_para(doc, "")
add_run(p, "Chức vụ, đơn vị công tác: ", bold=True)
add_run(p, "{{ mau_03.chuc_vu_don_vi }}")

add_para(doc, "Tỷ lệ đóng góp:", bold=True, before=6)

t3 = doc.add_table(rows=4, cols=5)
t3.style = "Table Grid"
for i, h in enumerate(["STT", "Họ và tên", "Đơn vị công tác", "% đóng góp", "Chữ ký xác nhận"]):
    set_cell_text(t3.rows[0].cells[i], h, bold=True, align="center")
set_cell_text(t3.rows[1].cells[0], "{%tr for item in mau_03.ty_le_dong_gop %}")
r3 = t3.rows[2].cells
set_cell_text(r3[0], "{{ item.stt }}", align="center")
set_cell_text(r3[1], "{{ item.ho_ten }}")
set_cell_text(r3[2], "{{ item.don_vi }}")
set_cell_text(r3[3], "{{ item.phan_tram }}", align="center")
set_cell_text(r3[4], "{{ item.chu_ky }}", align="center")
set_cell_text(t3.rows[3].cells[0], "{%tr endfor %}")

# TỔNG row
row_tong = t3.add_row().cells
set_cell_text(row_tong[0], "TỔNG", bold=True, align="center")
row_tong[0].merge(row_tong[1]).merge(row_tong[2])
set_cell_text(row_tong[3], "100", bold=True, align="center")
set_cell_text(row_tong[4], "", align="center")

add_para(doc, "Lưu ý:", bold=True, italic=True, before=12)
add_para(doc, "- Tổng % đóng góp phải bằng 100", italic=True)
add_para(doc, "- Sinh viên trong nhóm tác giả cần ghi rõ là \u201CSinh viên khoa/trường…., Đại học Y Dược TP.HCM\u201D", italic=True)
add_para(doc, "- Tác giả là người ngoài trường cần ghi đúng đơn vị công tác hiện tại hoặc đơn vị công tác tự do nếu chưa có đơn vị công tác cụ thể.", italic=True)

add_para(doc, "", before=20)
add_para(doc, "TÁC GIẢ CHÍNH / ĐẠI DIỆN NHÓM TÁC GIẢ SÁNG KIẾN", bold=True, align="right")
add_para(doc, "(chữ ký và ghi rõ họ tên)", italic=True, align="right")
add_para(doc, "")
add_para(doc, "")
add_para(doc, "{{ mau_03.tac_gia_chinh_ky }}", bold=True, align="right")

page_break(doc)


# =====================================================================
# BẢN CAM KẾT
# =====================================================================
add_para(doc, "CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM", bold=True, align="center")
add_para(doc, "Độc lập - Tự do - Hạnh phúc", bold=True, align="center")
add_para(doc, "TP. Hồ Chí Minh, ngày {{ ban_cam_ket.ngay_ky.ngay }} tháng {{ ban_cam_ket.ngay_ky.thang }} năm {{ ban_cam_ket.ngay_ky.nam }}", italic=True, align="center", before=6)

add_para(doc, "BẢN CAM KẾT", bold=True, align="center", size=16, before=12)
add_para(doc, "(Áp dụng đối với cá nhân đăng ký xét công nhận sáng kiến – cải tiến kỹ thuật tại Đại học Y Dược TP. Hồ Chí Minh năm {{ ban_cam_ket.nam_xet }} là tác giả của bài báo khoa học)", italic=True, align="center")

add_para(doc, "I. THÔNG TIN CHỦ THỂ CAM KẾT:", bold=True, before=12)

p = add_para(doc, "")
add_run(p, "Tác giả đăng ký sáng kiến: ")
add_run(p, "{{ ban_cam_ket.tac_gia_dang_ky }}")

p = add_para(doc, "")
add_run(p, "CCCD/Hộ chiếu số: ")
add_run(p, "{{ ban_cam_ket.cccd }}")

p = add_para(doc, "")
add_run(p, "Đơn vị: ")
add_run(p, "{{ ban_cam_ket.don_vi }}")

p = add_para(doc, "")
add_run(p, "Tên Bài báo trong nước/quốc tế là sản phẩm của nhiệm vụ NCKH được đăng ký xét công nhận sáng kiến – cải tiến kỹ thuật tại ĐHYD TP.HCM năm ")
add_run(p, "{{ ban_cam_ket.nam_xet }}", bold=True)
add_run(p, ": ")
add_run(p, "{{ ban_cam_ket.ten_bai_bao }}")

p = add_para(doc, "", before=6)
add_run(p, "Với vai trò đối với bài báo ", italic=False)
add_run(p, "(☑ vào ô tương ứng)", italic=True)
add_run(p, ":")
add_para(doc, "{% if ban_cam_ket.vai_tro.tac_gia_chinh %}☑{% else %}☐{% endif %} 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.")
add_para(doc, "{% if ban_cam_ket.vai_tro.dong_tac_gia %}☑{% else %}☐{% endif %} Đồ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.")

add_para(doc, "II. CAM KẾT NỘI DUNG (☑ vào ô tương ứng):", bold=True, before=12)

add_para(doc, "- Quyền sở hữu đối với bài báo trong nước/quốc tế", bold=True, before=6)
add_para(doc, "{% if ban_cam_ket.cam_ket.quyen_so_huu_1 %}☑{% else %}☐{% endif %} 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.", align="justify")
add_para(doc, "{% if ban_cam_ket.cam_ket.quyen_so_huu_2 %}☑{% else %}☐{% endif %} 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.", align="justify")

add_para(doc, "- Đồng thuận của đồng tác giả bài báo trong nước/quốc tế", bold=True, before=6)
add_para(doc, "{% if ban_cam_ket.cam_ket.dong_thuan %}☑{% else %}☐{% endif %} 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.", align="justify")

add_para(doc, "- Cam kết bài báo trong nước/quốc tế uy tín", bold=True, before=6)
add_para(doc, "{% if ban_cam_ket.cam_ket.bai_bao_uy_tin %}☑{% else %}☐{% endif %} 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 \u201CTạp chí săn mồi\u201D. 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.", align="justify")

add_para(doc, "- Tuân thủ pháp luật sở hữu trí tuệ", bold=True, before=6)
add_para(doc, "{% if ban_cam_ket.cam_ket.tuan_thu_phap_luat %}☑{% else %}☐{% endif %} 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ơ.", align="justify")

add_para(doc, "III. HẬU QUẢ PHÁP LÝ KHI THÔNG TIN KHÔNG TRUNG THỰC", bold=True, before=12)
add_para(doc, "Tôi xin cam kết chịu trách nhiệm đối với các thông tin kê khai nêu trên. Nếu thông tin được khai trong bản cam kết này không đúng thì tôi chấp nhận:", align="justify")
add_para(doc, "- Hủy kết quả công nhận sáng kiến đã được xét (nếu có);")
add_para(doc, "- Thu hồi, hủy các danh hiệu thi đua, khen thưởng, hoặc các quyền lợi phát sinh có sử dụng sáng kiến này để xét;")
add_para(doc, "- Xử lý theo quy định pháp luật hiện hành và theo quy chế/quy định của ĐHYD.")
add_para(doc, "Cam kết này có hiệu lực kể từ ngày ký và ràng buộc đối với cá nhân cam kết trong suốt thời gian xét công nhận sáng kiến và sau khi kết thúc 02 năm.", align="justify")

add_para(doc, "", before=12)
add_para(doc, "NGƯỜI CAM KẾT", bold=True, align="right")
add_para(doc, "(Ký tên, ghi rõ họ tên)", italic=True, align="right")
add_para(doc, "")
add_para(doc, "")
add_para(doc, "{{ ban_cam_ket.nguoi_cam_ket }}", bold=True, align="right")

doc.save(OUTPUT)
print(f"✓ Template saved to: {OUTPUT}")
