import type { ProjectOp } from '../transforms.schema';
import { SOURCE_ROW_KEY, type Row } from '../row';

/**
 * project — 选列(等价 SELECT col1, col2 AS alias)
 *
 *   - keep 不写 = 全保留
 *   - rename 在 keep 通过后做改名(source → target);未在 rename 中的字段原名保留
 *
 * **__source_row 透传**:无论 keep 是否包含,真原文 link 始终保留(合规留底)。
 */
export function runProject(op: ProjectOp, rows: Row[]): Row[] {
  const keep = op.keep;
  const rename = op.rename ?? {};
  return rows.map((row) => {
    const out: Row = {};
    const keys = keep ?? Object.keys(row);
    for (const k of keys) {
      const targetKey = rename[k] ?? k;
      out[targetKey] = row[k];
    }
    // __source_row 始终透传(即便 keep 没列它)
    if (SOURCE_ROW_KEY in row) {
      out[SOURCE_ROW_KEY] = row[SOURCE_ROW_KEY];
    }
    return out;
  });
}
