#!/bin/bash

# =================配置区域=================
MAIL_TO="hitmickeyq@qq.com"
MONTHLY_LIMIT_GB=500 # 阈值单位：GB。设为 0 时表示不限制流量。
URL="https://officecdn.microsoft.com/pr/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-cn/ProPlus2021Retail.img"
STATUS_FILE="$(dirname "$0")/.netkeep_service.log" # 状态文件，存放在脚本同级目录
# ==========================================

echo "流量保镖服务已启动..."
echo "状态记录文件位置: $STATUS_FILE"

# 如果设为 0，则 MONTHLY_LIMIT_MB 也为 0
MONTHLY_LIMIT_MB=$(( MONTHLY_LIMIT_GB * 1000 ))

# 1. 状态文件初始化 (格式: 年-月 累计流量MB 邮件是否已发送)
if [ ! -f "$STATUS_FILE" ]; then
    echo "$(date +'%Y-%m') 0 0" > "$STATUS_FILE"
fi

while true; do
    # 2. 每次外层循环第一步：从本地文件读取绝对真实状态
    read SAVED_MONTH MONTHLY_TOTAL_MB EMAIL_SENT < "$STATUS_FILE"
    CURRENT_MONTH=$(date +'%Y-%m')

    # 3. 跨月检测（绝对可靠，无惧重启）
    if [ "$CURRENT_MONTH" != "$SAVED_MONTH" ]; then
        echo ">>> 检测到自然跨月 ($SAVED_MONTH -> $CURRENT_MONTH)，状态重置。"
        SAVED_MONTH=$CURRENT_MONTH
        MONTHLY_TOTAL_MB=0
        EMAIL_SENT=0
        echo "$SAVED_MONTH $MONTHLY_TOTAL_MB $EMAIL_SENT" > "$STATUS_FILE"
    fi

    # 4. 阈值拦截与单层休眠逻辑 (仅在 MONTHLY_LIMIT_GB 大于 0 时生效)
    if [ "$MONTHLY_LIMIT_GB" -gt 0 ] && [ "$MONTHLY_TOTAL_MB" -ge "$MONTHLY_LIMIT_MB" ]; then
        # 保证满额后只发一次邮件
        if [ "$EMAIL_SENT" -eq 0 ]; then
            echo ">>> 本月累计流量已达 ${MONTHLY_LIMIT_GB}GB，发送通知邮件..."
            Subject="流量保镖通知：本月累计流量已达 ${MONTHLY_LIMIT_GB}GB"
            msg="您的流量保镖服务本月累计下载已达 ${MONTHLY_LIMIT_GB}GB。\n时间：$(date +'%F %T')\n下载任务已自动暂停，将在下个月自动重置并恢复运行。"
            {
                echo "To: $MAIL_TO"
                echo "Subject: $Subject"
                echo "Date: $(date -R)"
                echo "Content-Type: text/plain; charset=UTF-8"
                echo
                echo -e "$msg"
            } | msmtp -a default "$MAIL_TO"
            
            EMAIL_SENT=1
            echo "$SAVED_MONTH $MONTHLY_TOTAL_MB $EMAIL_SENT" > "$STATUS_FILE"
        fi

        echo "$(date +'%T') 任务挂起：本月已达标。1小时后再次检测月份..."
        sleep 3600
        continue # 直接跳过下方下载，进入下一轮 while 循环重新核对月份
    fi

    # ------------------ 以下为核心下载逻辑 ------------------

    RANDOM_RATE=$(( (RANDOM % 3) + 1 ))
    RANDOM_TIME=$(( (RANDOM % 301) + 60 ))
    RANDOM_MB=$(( (RANDOM % 2001) + 2000 ))
    SIZE_BYTES=$(( RANDOM_MB * 1024 * 1024 ))

    echo "------------------------------------------------"
    echo -e "$(date +'%F %T'): 新一轮任务开始。\n计划速度：${RANDOM_RATE}MB/s，计划下载: ${RANDOM_MB}MB。\n该轮结束休息时间：${RANDOM_TIME}s。"

    # 如果你想看进度条，这里保留了你的 -s（静音）和 -w 配合。若要进度条，请将 -s 改为 -#
    RESULT=$(curl -L -o /dev/null \
        --limit-rate "${RANDOM_RATE}M" \
        -r 0-$((SIZE_BYTES - 1)) \
        -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" \
        --connect-timeout 20 \
        -w "%{http_code} %{size_download}" \
        "$URL" | tr -d '\0')

    read HTTP_CODE BYTES_DOWNLOADED <<< "$RESULT"

    if ! [[ "$BYTES_DOWNLOADED" =~ ^[0-9]+$ ]]; then
        BYTES_DOWNLOADED=0
    fi

    ACTUAL_MB=$(( BYTES_DOWNLOADED / 1024 / 1024 ))

    if [[ "$HTTP_CODE" -eq 200 || "$HTTP_CODE" -eq 206 ]]; then
        MONTHLY_TOTAL_MB=$(( MONTHLY_TOTAL_MB + ACTUAL_MB ))
        # 每次成功下载后，立刻将最新流量写入硬盘
        echo "$SAVED_MONTH $MONTHLY_TOTAL_MB $EMAIL_SENT" > "$STATUS_FILE"
        echo "结果: 任务完成 | HTTP $HTTP_CODE | 实际获取: ${ACTUAL_MB}MB | 本月累计: ${MONTHLY_TOTAL_MB}MB"
    else
        echo "结果: 任务失败 | HTTP $HTTP_CODE | 流量未计入"
        Subject="流量保镖警告：下载任务失败 (HTTP $HTTP_CODE)"
        msg="流量保镖检测到一次下载异常：\n\n状态码：$HTTP_CODE\n时间：$(date +'%F %T')\n\n该轮流量未计入统计，系统将按计划进入休息阶段。"

        {
            echo "To: $MAIL_TO"
            echo "Subject: $Subject"
            echo "Date: $(date -R)"
            echo "Content-Type: text/plain; charset=UTF-8"
            echo
            echo -e "$msg"
        } | msmtp -a default "$MAIL_TO"
    fi

    echo "本轮结束，休息 ${RANDOM_TIME} 秒..."
    sleep ${RANDOM_TIME}
done