///|
/// docking_demo — Vina-lite 刚体对接演示:
/// 原子墙受体口袋 + 4C 小配体 -> 口袋检测 -> 平移 x 旋转网格
/// 构象搜索 -> LJ+Coulomb 打分 -> 姿势排名(PDBQT/JSON).

///|
fn dkd_receptor() -> Array[@src.DockAtom] {
  let atoms : Array[@src.DockAtom] = Array(capacity=0)
  // x=10 处 7x7 原子墙(口袋朝向 x-)
  for i = -3; i <= 3; i = i + 1 {
    for j = -3; j <= 3; j = j + 1 {
      atoms.push(@src.DockAtom::{
        x: 10.0,
        y: i.to_double(),
        z: j.to_double(),
        element: "C",
        charge: 0.0,
      })
    }
  }
  // 带正电的极性位点(墙中央)
  atoms.push(@src.DockAtom::{
    x: 10.0,
    y: 0.0,
    z: 0.0,
    element: "N",
    charge: 0.4,
  })
  atoms
}

///|
/// 6 原子配体(苯环简化 + O 受体), 初始在原点.
fn dkd_ligand() -> Array[@src.DockAtom] {
  [
    @src.DockAtom::{ x: -0.7, y: -0.7, z: 0.0, element: "C", charge: 0.0, },
    @src.DockAtom::{ x: 0.7, y: -0.7, z: 0.0, element: "C", charge: 0.0, },
    @src.DockAtom::{ x: 0.7, y: 0.7, z: 0.0, element: "C", charge: 0.0, },
    @src.DockAtom::{ x: -0.7, y: 0.7, z: 0.0, element: "C", charge: 0.0, },
    @src.DockAtom::{ x: 1.9, y: 0.0, z: 0.0, element: "O", charge: -0.5, },
    @src.DockAtom::{ x: -1.9, y: 0.0, z: 0.0, element: "H", charge: 0.2, },
  ]
}

///|
fn main {
  println(
    "1. Vina-lite 刚体对接演示(平移格点 x 欧拉角网格, LJ+Coulomb 打分)",
  )
  let receptor = dkd_receptor()
  println(
    "2. 受体: \{receptor.length()} 原子(7x7 原子墙 + 极性位点)",
  )
  // 3. 口袋检测(参考位点模式: 墙前 LJ 势阱区中心)
  let pocket = @src.docking_find_pocket(
    receptor,
    center=Some((5.0, 0.0, 0.0)),
    radius=6.0,
  ).unwrap()
  println(
    "3. 口袋检测(参考位点): 中心=(\{pocket.cx}, \{pocket.cy}, \{pocket.cz}), 原子数=\{pocket.n_atoms}",
  )
  // 4. 构象搜索
  let params : @src.DockParams = {
    search_radius: 2.0,
    translate_step: 1.0,
    rotations: 4,
    top_k: 5,
  }
  let poses = @src.docking_search(pocket, dkd_ligand(), params~)
  println(
    "4. 构象搜索(半径\{params.search_radius}A/步\{params.translate_step}A/每轴\{params.rotations}旋转): 前 5 姿势",
  )
  for i = 0; i < poses.length(); i = i + 1 {
    let p = poses[i]
    let (lcx, lcy, lcz) = @src.docking_ligand_center(p.ligand)
    println(
      "  #\{i + 1}: energy=\{p.energy}, 配体质心=(\{lcx}, \{lcy}, \{lcz})",
    )
  }
  // 5. 导出
  let pdbqt = @src.docking_pose_pdbqt(poses[0])
  let json = @src.docking_json(poses)
  println(
    "5. 最优姿势 PDBQT \{pdbqt.length()} 字节, JSON \{json.length()} 字节",
  )
  println(@src.docking_summary_line(poses))
  println(
    "演示完成: 受体口袋 -> 刚体构象枚举 -> 能量排名 -> 姿势输出闭环",
  )
}