#!/usr/bin/env bash
# Pull latest vocab.csv from a git repo, build an .apkg, import it into Anki
# via AnkiConnect, then trigger an AnkiWeb sync. Meant to run on a timer
# (cron/launchd). Requires Anki open with the AnkiConnect addon.
set -euo pipefail

# ---- config ----
REPO="$HOME/path/to/vocab-repo"        # git repo containing vocab.csv
WORK_DIR="$HOME/path/to/anki-sync"     # holds venv, state, built .apkg
LOG_DIR="$WORK_DIR/logs"
PY="$WORK_DIR/.venv/bin/python"
BUILDER="$WORK_DIR/build_deck.py"      # your script: build_deck.py <csv> <apkg>
CSV="$REPO/vocab.csv"
APKG="$WORK_DIR/deck.apkg"
ANKI_URL="http://127.0.0.1:8765"       # AnkiConnect default
# ----------------

mkdir -p "$LOG_DIR" "$WORK_DIR/state"
log() { echo "$(date -Iseconds) $*" >> "$LOG_DIR/sync.log"; }

cd "$REPO"
git pull --ff-only origin "$(git symbolic-ref --short HEAD)" >/dev/null 2>&1 || {
  log "git pull failed"; exit 0; }

[[ -f "$CSV" ]] || { log "no vocab.csv in repo"; exit 0; }

# AnkiConnect reachable = Anki is open and the addon is loaded
curl -fsS -m 3 -X POST "$ANKI_URL" \
  -d '{"action":"version","version":6}' >/dev/null 2>&1 \
  || { log "AnkiConnect unreachable, deferring"; exit 0; }

# Rebuild only when the CSV hash or the calendar day changed
CUR_SHA="$(shasum -a 256 "$CSV" | cut -d' ' -f1)"
TODAY="$(date +%Y-%m-%d)"
KEY="$CUR_SHA|$TODAY"
LAST_KEY="$(cat "$WORK_DIR/state/last_csv_sha.txt" 2>/dev/null || echo none)"
[[ "$KEY" == "$LAST_KEY" ]] && exit 0

"$PY" "$BUILDER" "$CSV" "$APKG"

R="$(curl -fsS -X POST "$ANKI_URL" -d @- <<JSON
{"action":"importPackage","version":6,"params":{"path":"$APKG"}}
JSON
)" || { log "AnkiConnect import call failed"; exit 0; }

echo "$R" | grep -qE '"error":\s*null' || { log "import error: $R"; exit 0; }

echo "$KEY" > "$WORK_DIR/state/last_csv_sha.txt"
log "deck imported ok ($TODAY)"
curl -fsS -X POST "$ANKI_URL" -d '{"action":"sync","version":6}' >/dev/null || true
log "ankiweb sync triggered"

# src: ezra, contact: ezkru69@mail.com