#!/bin/bash
# 内容测试问题反馈群消息同步到飞书电子表格脚本
# 群ID: oc_fabff7672e62a9ced7b326ee4a286c26
# 目标表格: https://makee-interactive.feishu.cn/wiki/EiPtw2fqWialDIkDvmAcXKp7nUF
# Bot: xiaokui
# 输出格式：电子表格行（时间 | 反馈人 | 信息类型 | 信息内容(或地址)）

# 不使用 set -e，手动处理错误
set -uo pipefail

# 配置项
CHAT_ID="oc_fabff7672e62a9ced7b326ee4a286c26"
SPREADSHEET_TOKEN="EiPtw2fqWialDIkDvmAcXKp7nUF"
SHEET_ID="7bce8f"
LAST_SYNC_FILE="/tmp/last_feedback_sync_time"
LARK_CLI_CONFIG="/root/.openclaw/credentials/xiaokui"
WORK_DIR="/tmp/feedback_sync_workdir"
LOG_PREFIX="[$(date '+%Y-%m-%d %H:%M:%S')]"

# 确保工作目录存在
mkdir -p "$WORK_DIR"

# 初始化上次同步时间（ISO 8601格式存储）
if [ ! -f "$LAST_SYNC_FILE" ]; then
    date -d '1 hour ago' --iso-8601=seconds > "$LAST_SYNC_FILE"
fi

LAST_SYNC_ISO=$(cat "$LAST_SYNC_FILE")
CURRENT_ISO=$(date --iso-8601=seconds)

echo "$LOG_PREFIX 开始同步: $LAST_SYNC_ISO -> $CURRENT_ISO"

# 1. 拉取群消息（使用xiaokui Bot身份）
MESSAGES_JSON=$(LARKSUITE_CLI_CONFIG_DIR="$LARK_CLI_CONFIG" lark-cli im +chat-messages-list \
    --chat-id "$CHAT_ID" \
    --start "$LAST_SYNC_ISO" \
    --end "$CURRENT_ISO" \
    --sort asc \
    --page-size 50 \
    --as bot 2>/dev/null)

# 检查API调用是否成功
API_OK=$(echo "$MESSAGES_JSON" | jq -r '.ok // false')
if [ "$API_OK" != "true" ]; then
    ERROR_MSG=$(echo "$MESSAGES_JSON" | jq -r '.error.message // "unknown error"')
    echo "$LOG_PREFIX API调用失败: $ERROR_MSG"
    exit 1
fi

# 提取消息列表
MESSAGES=$(echo "$MESSAGES_JSON" | jq -c '.data.messages[]?' 2>/dev/null)

if [ -z "$MESSAGES" ]; then
    echo "$LOG_PREFIX 没有新消息，同步结束"
    echo "$CURRENT_ISO" > "$LAST_SYNC_FILE"
    exit 0
fi

MSG_COUNT=$(echo "$MESSAGES" | wc -l)
echo "$LOG_PREFIX 发现 $MSG_COUNT 条新消息"

# 2. 处理每条消息，构建电子表格行数据
ROWS="[]"
PROCESSED=0

while IFS= read -r msg; do
    MSG_ID=$(echo "$msg" | jq -r '.message_id')
    SENDER_NAME=$(echo "$msg" | jq -r '.sender.name // "未知"')
    CREATE_TIME=$(echo "$msg" | jq -r '.create_time // ""')
    MSG_TYPE=$(echo "$msg" | jq -r '.msg_type')
    CONTENT=$(echo "$msg" | jq -r '.content // ""')
    DELETED=$(echo "$msg" | jq -r '.deleted // false')

    # 跳过已删除和系统消息
    if [ "$DELETED" = "true" ] || [ "$MSG_TYPE" = "system" ]; then
        continue
    fi

    # 类型和内容处理
    TYPE=""
    CELL_CONTENT=""

    case "$MSG_TYPE" in
        "text"|"post")
            TYPE="文本"
            # 清理HTML标签和换行
            CELL_CONTENT=$(echo "$CONTENT" | sed 's/<[^>]*>//g' | tr '\n' ' ' | head -c 500)
            ;;
        "image")
            TYPE="图片"
            IMAGE_KEY=$(echo "$CONTENT" | grep -oP 'img_[a-zA-Z0-9_-]+' | head -1 || true)
            if [ -n "$IMAGE_KEY" ]; then
                # 上传图片到COS获取链接
                IMG_FILE="${WORK_DIR}/${MSG_ID}.png"
                DL_RESULT=$(LARKSUITE_CLI_CONFIG_DIR="$LARK_CLI_CONFIG" lark-cli im +messages-resources-download \
                    --message-id "$MSG_ID" \
                    --file-key "$IMAGE_KEY" \
                    --type image \
                    --output "$IMG_FILE" \
                    --as bot 2>/dev/null || echo '{"ok":false}')
                DL_OK=$(echo "$DL_RESULT" | jq -r '.ok // false' 2>/dev/null)
                if [ "$DL_OK" = "true" ] && [ -s "$IMG_FILE" ]; then
                    # 调用COS上传脚本获取链接
                    COS_URL=$(bash /root/.openclaw/workspace-xiaokui/scripts/upload_to_cos.sh "$IMG_FILE" 2>/dev/null || echo "")
                    if [ -n "$COS_URL" ]; then
                        CELL_CONTENT="$COS_URL"
                    else
                        CELL_CONTENT="图片上传失败"
                    fi
                    rm -f "$IMG_FILE" 2>/dev/null
                else
                    CELL_CONTENT="图片下载失败"
                fi
            else
                CELL_CONTENT="无图片链接"
            fi
            ;;
        "media")
            TYPE="视频"
            VIDEO_NAME=$(echo "$CONTENT" | grep -oP 'name="[^"]*"' | head -1 | sed 's/name="//;s/"//' || echo "视频")
            DURATION=$(echo "$CONTENT" | grep -oP 'duration="[^"]*"' | head -1 | sed 's/duration="//;s/"//' || echo "")
            CELL_CONTENT="${VIDEO_NAME} (时长${DURATION}秒)"
            ;;
        "audio")
            TYPE="语音"
            CELL_CONTENT="语音消息"
            ;;
        "file")
            TYPE="文件"
            FILE_NAME=$(echo "$CONTENT" | jq -r '.file_name // "未知文件"' 2>/dev/null || echo "文件")
            CELL_CONTENT="$FILE_NAME"
            ;;
        "sticker")
            TYPE="表情"
            CELL_CONTENT="表情包"
            ;;
        *)
            TYPE="其他"
            CELL_CONTENT="${MSG_TYPE}类型消息"
            ;;
    esac

    # 回复标记
    REPLY_TO=$(echo "$msg" | jq -r '.reply_to // empty')
    if [ -n "$REPLY_TO" ]; then
        CELL_CONTENT="[回复] ${CELL_CONTENT}"
    fi

    # 添加行数据
    ROW=$(echo "[]" | jq --arg t "$CREATE_TIME" --arg s "$SENDER_NAME" --arg ty "$TYPE" --arg c "$CELL_CONTENT" '. + [$t, $s, $ty, $c]')
    ROWS=$(echo "$ROWS" | jq --argjson row "$ROW" '. + [$row]')
    PROCESSED=$((PROCESSED + 1))

done <<< "$MESSAGES"

# 3. 将行数据追加到电子表格
if [ "$PROCESSED" -gt 0 ]; then
    echo "$ROWS" > "${WORK_DIR}/rows.json"
    APPEND_RESULT=$(LARKSUITE_CLI_CONFIG_DIR="$LARK_CLI_CONFIG" lark-cli sheets +append \
        --spreadsheet-token "$SPREADSHEET_TOKEN" \
        --range "${SHEET_ID}!A:D" \
        --values "$(cat "${WORK_DIR}/rows.json")" \
        --as bot 2>&1)

    APPEND_OK=$(echo "$APPEND_RESULT" | jq -r '.ok // false' 2>/dev/null)
    if [ "$APPEND_OK" = "true" ]; then
        echo "$LOG_PREFIX 电子表格写入成功，共 $PROCESSED 条消息"
    else
        echo "$LOG_PREFIX 电子表格写入失败: $APPEND_RESULT"
        exit 1
    fi

    echo "$LOG_PREFIX 同步完成: $PROCESSED 条消息"
    echo "$CURRENT_ISO" > "$LAST_SYNC_FILE"
else
    echo "$LOG_PREFIX 处理后无有效消息"
    echo "$CURRENT_ISO" > "$LAST_SYNC_FILE"
fi

# 清理
rm -f "$WORK_DIR"/om_*.png "$WORK_DIR"/sync_content.md 2>/dev/null
