#!/usr/bin/env bash
# AUTHOR: Daesorin
# CREATED: 2026-08-08 16:59 +0100

set -Eeuo pipefail

# CONFIGURATION
LOCAL_VAULT="${HOME}/obsidian"
REMOTE_HOST="ish"
REMOTE_VAULT="~/obsidian"

RSYNC_FLAGS=(
    -az
    --delete
    --human-readable
    --itemize-changes
)

EXCLUDES=(
    --exclude=".DS_Store"
    --exclude=".Trash-*"

    # Obsidian cache
    --exclude=".obsidian/cache/"
    --exclude=".obsidian/workspace*.json"
    --exclude=".obsidian/workspace-mobile.json"

    # Vim
    --exclude="*.swp"
    --exclude="*.swo"

    # Temporary files
    --exclude="*~"
)

# HELP
usage() {
cat <<EOF
obsd - Obsidian Vault Synchroniser

Usage:
    obsd push
    obsd pull
    obsd status
    obsd diff
    obsd backup
    obsd help

Commands

    push        Local -> iSH
    pull        iSH -> Local
    status      Dry-run using timestamps
    diff        Dry-run using checksums
    backup      Create compressed archive
EOF
}

# CHECKS
check_requirements() {
    command -v rsync >/dev/null \
        || { echo "rsync not installed."; exit 1; }

    command -v ssh >/dev/null \
        || { echo "ssh not installed."; exit 1; }

    [[ -d "$LOCAL_VAULT" ]] \
        || { echo "Vault not found: $LOCAL_VAULT"; exit 1; }
}

# BACKUP
backup() {
    local backup_dir="${HOME}/obsidian-backups"
    mkdir -p "$backup_dir"

    local stamp
    stamp="$(date +%Y%m%d-%H%M%S)"

    local archive="${backup_dir}/obsidian-${stamp}.tar.zst"

    echo "Creating backup..."

    tar \
        --zstd \
        -cf "$archive" \
        -C "$HOME" \
        obsidian

    echo
    echo "Backup created:"
    echo "  $archive"
}

# PUSH
push() {
    rsync \
        "${RSYNC_FLAGS[@]}" \
        "${EXCLUDES[@]}" \
        "${LOCAL_VAULT}/" \
        "${REMOTE_HOST}:${REMOTE_VAULT}/"
}

# PULL
pull() {
    rsync \
        "${RSYNC_FLAGS[@]}" \
        "${EXCLUDES[@]}" \
        "${REMOTE_HOST}:${REMOTE_VAULT}/" \
        "${LOCAL_VAULT}/"
}

# STATUS
status() {
    rsync \
        -azin \
        "${EXCLUDES[@]}" \
        "${LOCAL_VAULT}/" \
        "${REMOTE_HOST}:${REMOTE_VAULT}/"
}

# DIFF
diff() {
    rsync \
        -azcin \
        "${EXCLUDES[@]}" \
        "${LOCAL_VAULT}/" \
        "${REMOTE_HOST}:${REMOTE_VAULT}/"
}

# MAIN
check_requirements

case "${1:-help}" in
    push)
        push
        ;;
    pull)
        pull
        ;;
    status)
        status
        ;;
    diff)
        diff
        ;;
    backup)
        backup
        ;;
    help|-h|--help)
        usage
        ;;
    *)
        echo "Unknown command: ${1}"
        echo
        usage
        exit 1
        ;;
esac
