#!/usr/bin/env bash
set -euo pipefail

# Detect installed binaries
HAS_DELTA=$(command -v delta 2>/dev/null || true)
HAS_DIFFT=$(command -v difft 2>/dev/null || true)

# ==============================================================================
# MODE 1: GIT_EXTERNAL_DIFF / diff.external
# Git passes exactly 7 arguments:
# $1: path $2: old-file $3: old-hex $4: old-mode $5: new-file $6: new-hex $7: new-mode
# ==============================================================================
if [ "$#" -eq 7 ]; then
    DISPLAY_PATH="$1"
    OLD_FILE="$2"
    NEW_FILE="$5"

    # 1. Difftastic installed -> Native AST structural file comparison
    if [ -n "$HAS_DIFFT" ]; then
        # Pass file metadata and display path to difft
        exec difft --display=side-by-side-show-both "$OLD_FILE" "$NEW_FILE"

    # 2. Delta installed (Difftastic missing) -> Standard diff piped into delta
    elif [ -n "$HAS_DELTA" ]; then
        diff -u -p --label "a/$DISPLAY_PATH" "$OLD_FILE" --label "b/$DISPLAY_PATH" "$NEW_FILE" | delta

    # 3. Neither installed -> Standard unified diff
    else
        diff -u -p --label "a/$DISPLAY_PATH" "$OLD_FILE" --label "b/$DISPLAY_PATH" "$NEW_FILE" || true
    fi

# ==============================================================================
# MODE 2: GIT_PAGER / core.pager
# Invoked as a downstream filter/pager for stdout (stdin contains diff/log output)
# ==============================================================================
else
    # 1. Delta installed -> Rich pager for git log, git show, git diff, etc.
    if [ -n "$HAS_DELTA" ]; then
        exec delta "$@"

    # 2. Difftastic installed (Delta missing) -> Read unified diff from stdin
    elif [ -n "$HAS_DIFFT" ]; then
        exec difft "$@"

    # 3. Neither installed -> Fall back to system pager
    else
        exec "${PAGER:-less}" ${LESS:--FRX} "$@"
    fi
fi
