#!/bin/bash
#
# setup_letip_backup.sh
# ---------------------------------------------------------------------------
# 別マシン用セットアップスクリプト。
# 実行すると以下を行う:
#   1. ダウンロードスクリプト(download_letip.sh)を INSTALL_DIR に設置
#   2. 毎日 午前1:00 に実行する cron エントリを登録(冪等)
#
# 使い方:
#   このファイルを対象マシンにコピーして実行するだけ。
#     bash setup_letip_backup.sh
#
# 対象OS: macOS (crontab を使用)
# ---------------------------------------------------------------------------

set -euo pipefail

# ====== 設定(必要に応じて変更) =============================================
URL="https://zsystem.jp/backup/letip.csv"   # ダウンロード元
AUTH_USER="koukoku"                          # Basic認証ユーザー
AUTH_PASS="kouko9"                           # Basic認証パスワード

INSTALL_DIR="$HOME/letip_backup"             # スクリプト設置先
DATA_DIR="$INSTALL_DIR/data"                 # CSV保存先(日付付き)
RETENTION_DAYS=90                            # 何日分の履歴を残すか(0で無制限)
CRON_HOUR=1                                  # 実行時刻(時)
CRON_MIN=0                                   # 実行時刻(分)
# ===========================================================================

DOWNLOADER="$INSTALL_DIR/download_letip.sh"
LOG_FILE="$INSTALL_DIR/download_letip.log"

echo "==> セットアップ開始"
echo "    設置先 : $INSTALL_DIR"
echo "    保存先 : $DATA_DIR"
echo "    実行   : 毎日 $(printf '%02d:%02d' "$CRON_HOUR" "$CRON_MIN")"

mkdir -p "$DATA_DIR"

# ---- ダウンロードスクリプトを生成 ----------------------------------------
cat > "$DOWNLOADER" <<EOF
#!/bin/bash
#
# download_letip.sh — letip.csv を日付付きでダウンロード(自動生成)
#
set -euo pipefail

URL="$URL"
AUTH_USER="$AUTH_USER"
AUTH_PASS="$AUTH_PASS"
DATA_DIR="$DATA_DIR"
RETENTION_DAYS=$RETENTION_DAYS
EOF

# 以下は変数展開せずそのまま埋め込む(クォートEOF)
cat >> "$DOWNLOADER" <<'EOF'

STAMP="$(date +%Y-%m-%d)"
DEST="$DATA_DIR/letip_${STAMP}.csv"
TMP="$(mktemp "${DEST}.XXXXXX")"

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; }

cleanup_tmp() { [ -f "$TMP" ] && rm -f "$TMP"; }
trap cleanup_tmp EXIT

log "ダウンロード開始: $URL"

# --fail でHTTPエラー時に非0終了 / -sS で進捗非表示・エラーは表示
if ! curl --fail -sS \
        --user "${AUTH_USER}:${AUTH_PASS}" \
        --connect-timeout 30 --max-time 300 \
        --retry 3 --retry-delay 10 \
        -o "$TMP" "$URL"; then
    log "ERROR: ダウンロード失敗 (curl exit=$?)"
    exit 1
fi

# 空ファイルチェック
if [ ! -s "$TMP" ]; then
    log "ERROR: 取得したファイルが空です"
    exit 1
fi

# atomic に確定(失敗しても前回分は残る)
mv -f "$TMP" "$DEST"
log "保存完了: $DEST ($(wc -c < "$DEST" | tr -d ' ') bytes)"

# 古い履歴を削除
if [ "$RETENTION_DAYS" -gt 0 ]; then
    find "$DATA_DIR" -name 'letip_*.csv' -type f -mtime "+$RETENTION_DAYS" -print -delete \
        | while read -r f; do log "保持期間超過のため削除: $f"; done
fi

log "完了"
EOF

chmod +x "$DOWNLOADER"
echo "==> ダウンロードスクリプトを設置: $DOWNLOADER"

# ---- cron 登録(冪等) -----------------------------------------------------
CRON_LINE="$CRON_MIN $CRON_HOUR * * * $DOWNLOADER >> $LOG_FILE 2>&1"
CRON_TAG="# letip_backup (auto)"

# 既存の同タグ行を除去してから追記
EXISTING="$(crontab -l 2>/dev/null || true)"
NEW_CRON="$(printf '%s\n' "$EXISTING" | grep -vF "$CRON_TAG" | grep -vF "$DOWNLOADER" || true)"
{
    printf '%s\n' "$NEW_CRON" | sed '/^$/d'
    printf '%s\n%s\n' "$CRON_TAG" "$CRON_LINE"
} | crontab -

echo "==> cron 登録完了:"
echo "    $CRON_LINE"
echo ""
echo "==> 現在の crontab:"
crontab -l | sed 's/^/    /'

echo ""
echo "==> 完了しました。"
echo "    手動テスト: bash \"$DOWNLOADER\" && ls -l \"$DATA_DIR\""
echo ""
echo "    [macOS注意] スリープ中は cron が動作しません。"
echo "    常時起動でない場合は『システム設定 > エネルギー』でスリープ防止、"
echo "    または下記で午前1時に自動起動するよう設定してください:"
echo "      sudo pmset repeat wakeorpoweron MTWRFSU 00:55:00"
