#!/bin/bash
set -euo pipefail

CONDA_BIN=${CONDA_BIN:-}
if [ -z "$CONDA_BIN" ]; then
  if command -v conda >/dev/null 2>&1; then
    CONDA_BIN=$(command -v conda)
  elif [ -x /opt/miniconda/bin/conda ]; then
    CONDA_BIN=/opt/miniconda/bin/conda
  fi
fi

if [ -n "$CONDA_BIN" ]; then
  eval "$("$CONDA_BIN" shell.bash hook)"
  conda activate focallora
else
  echo "[Ident_verb_test_dataset.sh] Warning: conda not found; running in current environment." >&2
fi

SCRIPT_DIR="$(cd -- "$(dirname "$0")" && pwd)"
export PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}"
export IGNORE_REASONING_MESSAGES="${IGNORE_REASONING_MESSAGES:-1}"

TRAJ_PATH="${TRAJ_PATH:-/data/local/hujk/BUTTON/crafted_data/attack_dh_traj.jsonl}"
TOKENIZER_PATH="${TOKENIZER_PATH:-/data/local/hujk/models/Qwen3-8B}"

python3 - <<'PY'
import json
import os
from pathlib import Path
from transformers import AutoTokenizer
from lib_tokenize_data_mask import (
    apply_chat_with_tokenize_with_mark,
    apply_chat_with_tokenize_original,
    filter_reasoning_messages,
    is_ignore_reasoning_enabled,
    strip_markers,
)

traj_path = Path(os.getenv("TRAJ_PATH", "/data/local/hujk/BUTTON/crafted_data/attack_dh_traj.jsonl"))
tokenizer_path = os.getenv("TOKENIZER_PATH", "/data/local/hujk/models/Qwen3-8B")

first_line = traj_path.read_text().splitlines()[0]
record = json.loads(first_line)
messages = record["trajectory"]
tools = record.get("tools")

ignore_flag = is_ignore_reasoning_enabled()
filtered = filter_reasoning_messages(messages, ignore_flag)
# Sanitize contents to strings for deterministic rendering.
sanitized = []
for m in filtered:
    m = dict(m)
    if m.get("content") is None:
        m["content"] = ""
    elif not isinstance(m.get("content"), str):
        m["content"] = json.dumps(m["content"])
    sanitized.append(m)

print(f"IGNORE_REASONING_MESSAGES={ignore_flag}")
print(f"Messages: original={len(messages)} filtered={len(filtered)}")
print(
    "Reasoning messages removed:",
    len([m for m in messages if "reasoning_content" in m]) - len(
        [m for m in filtered if "reasoning_content" in m]
    ),
)

tok = AutoTokenizer.from_pretrained(tokenizer_path)
if tok.pad_token is None:
    tok.pad_token = tok.eos_token

input_ids, instr_mask, data_mask, segment_type, is_normal_token, _custom_mask, rendered = apply_chat_with_tokenize_with_mark(
    sanitized, tok, tools=tools
)
orig_ids, orig_render = apply_chat_with_tokenize_original(sanitized, tok, tools=tools)

print(f"Token count: {len(input_ids)}")
print(f"Instruction tokens: {sum(instr_mask)}")
print(f"Data tokens: {sum(data_mask)}")
print(f"Segment labels present: {sorted(set(segment_type))}")
print(f"input_ids match original: {input_ids == orig_ids}")
print("\nRendered preview with markers (first 300 chars):")
print(rendered[:300])
cleaned = strip_markers(rendered)
print("\nRendered preview (markers stripped, first 300 chars):")
print(cleaned[:300])

# Detailed token/mask dump
tokens = [tok.decode(t).replace("\n","\\n") for t in input_ids]
print("\nidx\tinstr\tdata\tseg\tnorm\ttoken")
for i, (t, im, dm, seg, norm) in enumerate(zip(tokens, instr_mask, data_mask, segment_type, is_normal_token)):
    print(f"{i}\t{int(im)}\t{int(dm)}\t{seg}\t{int(norm)}\t{t}")

print("\n--- Original apply_chat_template + tokenizer ---")
orig_tokens = tok.convert_ids_to_tokens(orig_ids)
for i, t in enumerate(orig_tokens[:50]):
    human = tok.convert_tokens_to_string([t]) or t
    print(f"{i}\t{human}")
PY
