/**
 * Maps `ApplicationFormState.banCamKet` into `bieu_mau_sang_kien_template.json` keys under `BẢN CAM KẾT`,
 * so `official_to_data_blank` (be01) can fill `ban_cam_ket` for `template_application_form.docx`.
 */
import emptyTemplate from './bieu_mau_sang_kien_template.json';
import { type BanCamKet, ensureBanCamKet } from './initiativeFormTypes';

type OfficialDoc = typeof emptyTemplate;

/** Must match `fe0/public/assets/bieu_mau_sang_kien_template.json` → `BẢN CAM KẾT` → `II...` keys. */
const K_II_QUYEN = '1. Quyền sở hữu đối với bài báo trong nước/quốc tế';
const K_II_DONG_THUAN = '2. Đồng thuận của đồng tác giả bài báo trong nước/quốc tế';
const K_II_UY_TIN = '3. Cam kết bài báo trong nước/quốc tế uy tín';
const K_II_TUAN_THU = '4. Tuân thủ pháp luật sở hữu trí tuệ';

const K_QUYEN_1 =
  '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';
const K_QUYEN_2 =
  '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';

const K_DONG_THUAN_LONG =
  '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';

const K_UY_TIN_LONG =
  "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";

const K_TUAN_THU_LONG =
  '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ơ';

const K_TEN_BAI_BAO =
  'Tên Bài báo trong nước/quốc tế là sản phẩm của nhiệm vụ NCKH';

export function applyBanCamKetToOfficialDoc(
  doc: OfficialDoc,
  raw: BanCamKet | null | undefined,
): void {
  const b = ensureBanCamKet(raw);
  const bck = doc['BẢN CAM KẾT'] as Record<string, unknown> | undefined;
  if (!bck || typeof bck !== 'object') return;

  const ngay = bck['Ngày ký'];
  if (ngay && typeof ngay === 'object') {
    const n = ngay as Record<string, string>;
    n['Ngày'] = String(b.ngay_ky.ngay ?? '');
    n['Tháng'] = String(b.ngay_ky.thang ?? '');
    n['Năm'] = String(b.ngay_ky.nam ?? '');
  }

  const i1 = bck['I. THÔNG TIN CHỦ THỂ CAM KẾT'];
  if (i1 && typeof i1 === 'object') {
    const i = i1 as Record<string, unknown>;
    i['Tác giả đăng ký sáng kiến'] = b.tac_gia_dang_ky;
    i['CCCD/Hộ chiếu số'] = b.cccd;
    i['Đơn vị'] = b.don_vi;
    i[K_TEN_BAI_BAO] = b.ten_bai_bao;
    i['Năm xét công nhận sáng kiến'] = b.nam_xet;
    const vt = i['Vai trò đối với bài báo (☑ vào ô tương ứng)'];
    if (vt && typeof vt === 'object') {
      const v = vt as Record<string, boolean>;
      v['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'] =
        Boolean(b.vai_tro.tac_gia_chinh);
      v['Đồ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'] =
        Boolean(b.vai_tro.dong_tac_gia);
    }
  }

  const ii = bck['II. CAM KẾT NỘI DUNG (☑ vào ô tương ứng)'];
  if (ii && typeof ii === 'object') {
    const section = ii as Record<string, unknown>;
    const quyen = section[K_II_QUYEN];
    if (quyen && typeof quyen === 'object') {
      const q = quyen as Record<string, boolean>;
      q[K_QUYEN_1] = Boolean(b.cam_ket.quyen_so_huu_1);
      q[K_QUYEN_2] = Boolean(b.cam_ket.quyen_so_huu_2);
    }
    const dong = section[K_II_DONG_THUAN];
    if (dong && typeof dong === 'object') {
      const d = dong as Record<string, boolean>;
      d[K_DONG_THUAN_LONG] = Boolean(b.cam_ket.dong_thuan);
    }
    const uy = section[K_II_UY_TIN];
    if (uy && typeof uy === 'object') {
      const u = uy as Record<string, boolean>;
      u[K_UY_TIN_LONG] = Boolean(b.cam_ket.bai_bao_uy_tin);
    }
    const tt = section[K_II_TUAN_THU];
    if (tt && typeof tt === 'object') {
      const t = tt as Record<string, boolean>;
      t[K_TUAN_THU_LONG] = Boolean(b.cam_ket.tuan_thu_phap_luat);
    }
  }

  bck['Người cam kết (Ký tên, ghi rõ họ tên)'] = b.nguoi_cam_ket;
}
