#!/usr/bin/env bash
set -euo pipefail

API_KEY='re_6UQ8x7NV_Cwr1Yjp7XwYhLjv3nakV7fe1'
FROM_ADDR='noreply@mail.aihang365.com'
TO_ADDR='admin@aihang365.com'
REPLY_TO='admin@aihang365.com'
SUBJECT='Turing Code 1.0.1 已发布，欢迎安装并反馈'
TEXT_FILE='/tmp/turing_code_1_0_1_mail.txt'
HTML_FILE='/tmp/turing_code_1_0_1_mail.html'
RECIPIENT_FILE='/tmp/sub_lb_user_emails_20260404_000158.txt'
DEDUP_FILE='/tmp/sub_lb_user_emails_dedup_20260404_000158.txt'
RESULTS_FILE='/tmp/turing_code_1_0_1_bulk_mail_results_20260404_000158.jsonl'
TEST_BODY='/tmp/turing_code_1_0_1_mail_test_body.json'
BATCH_SIZE=40

build_payload() {
  local payload_file="$1"
  shift
  python3 - "$FROM_ADDR" "$TO_ADDR" "$SUBJECT" "$TEXT_FILE" "$HTML_FILE" "$REPLY_TO" "$@" <<'PY' > "$payload_file"
import json
import pathlib
import sys

from_addr = sys.argv[1]
to_addr = sys.argv[2]
subject = sys.argv[3]
text_file = sys.argv[4]
html_file = sys.argv[5]
reply_to = sys.argv[6]
bcc = sys.argv[7:]

payload = {
    'from': from_addr,
    'to': [to_addr],
    'subject': subject,
    'text': pathlib.Path(text_file).read_text(),
    'html': pathlib.Path(html_file).read_text(),
    'reply_to': reply_to,
}
if bcc:
    payload['bcc'] = bcc
print(json.dumps(payload, ensure_ascii=False))
PY
}

send_payload() {
  local payload_file="$1"
  local body_file="$2"
  local status
  status=$(curl --http1.1 --retry 3 --retry-delay 2 -sS -o "$body_file" -w '%{http_code}' \
    -X POST 'https://api.resend.com/emails' \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer ${API_KEY}" \
    --data @"$payload_file")
  if [[ ! "$status" =~ ^2 ]]; then
    echo "发信失败，HTTP ${status}" >&2
    cat "$body_file" >&2
    return 1
  fi
}

sort -u "$RECIPIENT_FILE" | grep -v '^$' | grep -v "^${TO_ADDR}$" > "$DEDUP_FILE"
mapfile -t RECIPIENTS < "$DEDUP_FILE"
TOTAL=${#RECIPIENTS[@]}
if [[ "$TOTAL" -eq 0 ]]; then
  echo '无可发送收件人' >&2
  exit 1
fi

: > "$RESULTS_FILE"

TEST_PAYLOAD='/tmp/turing_code_1_0_1_mail_test_payload.json'
build_payload "$TEST_PAYLOAD"
send_payload "$TEST_PAYLOAD" "$TEST_BODY"
echo '测试邮件发送成功' >&2
cat "$TEST_BODY" >&2

for ((i=0; i<TOTAL; i+=BATCH_SIZE)); do
  BCC_ARGS=()
  for ((j=i; j<i+BATCH_SIZE && j<TOTAL; j++)); do
    BCC_ARGS+=("${RECIPIENTS[j]}")
  done

  BATCH_NO=$((i / BATCH_SIZE + 1))
  COUNT=${#BCC_ARGS[@]}
  PAYLOAD_FILE="/tmp/turing_code_1_0_1_mail_batch_${BATCH_NO}.json"
  BODY_FILE="/tmp/turing_code_1_0_1_mail_batch_${BATCH_NO}_body.json"

  echo "发送批次 ${BATCH_NO}，收件人数 ${COUNT}" >&2
  build_payload "$PAYLOAD_FILE" "${BCC_ARGS[@]}"
  send_payload "$PAYLOAD_FILE" "$BODY_FILE"
  jq -nc --argjson batch "$BATCH_NO" --argjson recipients "$COUNT" --slurpfile body "$BODY_FILE" '{batch:$batch,recipients:$recipients,response:$body[0]}' >> "$RESULTS_FILE"
  sleep 2
done

wc -l "$RESULTS_FILE"
sed -n '1,20p' "$RESULTS_FILE"
