#!/bin/bash

set -e

URL="http://www.baidu.com/"
COUNT=10

echo "正在通过百度 HTTP 校准系统时间..."
echo

best_rtt=999999999
best_time=0

for i in $(seq 1 "$COUNT"); do
    start=$(date +%s%3N)

    headers=$(curl \
        --noproxy '*' \
        --connect-timeout 3 \
        --max-time 5 \
        -sS \
        -D - \
        -o /dev/null \
        "$URL" 2>/dev/null) || {
        echo "[$i/$COUNT] 请求失败"
        continue
    }

    end=$(date +%s%3N)

    date_header=$(printf '%s\n' "$headers" |
        grep -i '^Date:' |
        tail -n 1 |
        sed 's/^[Dd]ate:[[:space:]]*//')

    if [ -z "$date_header" ]; then
        echo "[$i/$COUNT] 未找到 Date 头"
        continue
    fi

    server_sec=$(date -u -d "$date_header" +%s 2>/dev/null) || {
        echo "[$i/$COUNT] 无法解析 Date: $date_header"
        continue
    }

    rtt=$((end - start))
    half_rtt=$((rtt / 2))

    # Date 头的时间 + 请求往返时间的一半
    estimated_ms=$((server_sec * 1000 + half_rtt))

    echo "[$i/$COUNT] RTT=${rtt}ms  Date=$date_header"

    if [ "$rtt" -lt "$best_rtt" ]; then
        best_rtt=$rtt
        best_time=$estimated_ms
    fi
done

if [ "$best_time" -eq 0 ]; then
    echo
    echo "错误：无法从百度获取时间"
    exit 1
fi

echo
echo "最佳 RTT: ${best_rtt}ms"

before=$(date '+%Y-%m-%d %H:%M:%S.%3N')

# 设置系统时间
date -u -s "@$(awk "BEGIN {printf \"%.3f\", $best_time / 1000}")" >/dev/null

after=$(date '+%Y-%m-%d %H:%M:%S.%3N')

echo "校时前: $before"
echo "校时后: $after"
echo "校时完成。"