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

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
HOMELAB_STATE_DIR="${HOMELAB_STATE_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/homelab}"
JOURNAL_DIR="${HOMELAB_CHANGE_JOURNAL_DIR:-${HOMELAB_STATE_DIR}/change-journal}"
ACTION="${1:-list}"

mkdir -p "$JOURNAL_DIR"

timestamp() {
    date -u +%Y%m%dT%H%M%SZ
}

latest_entries() {
    local count="${1:-20}"

    find "$JOURNAL_DIR" -maxdepth 1 -type f -name '*.log' -print 2>/dev/null |
        sort |
        tail -n "$count" |
        while IFS= read -r file; do
            printf '\n== %s ==\n' "$(basename "$file")"
            sed -n '1,80p' "$file"
        done
}

append_entry() {
    local command_name="${2:-unknown}"
    local detail="${3:-}"
    local now
    local file

    now="$(timestamp)"
    file="${JOURNAL_DIR}/${now}-${command_name//[^A-Za-z0-9_.-]/_}.log"

    {
        printf 'created_utc=%s\n' "$now"
        printf 'command=%s\n' "$command_name"
        printf 'detail=%s\n' "$detail"
        printf 'host=%s\n' "$(hostname 2>/dev/null || echo unknown)"
        printf 'repo=%s\n' "$REPO_ROOT"
        printf 'branch=%s\n' "$(git -C "$REPO_ROOT" rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)"
        printf 'revision=%s\n' "$(git -C "$REPO_ROOT" rev-parse HEAD 2>/dev/null || echo unknown)"
        printf 'dirty_files=%s\n' "$(git -C "$REPO_ROOT" status --short 2>/dev/null | wc -l | tr -d ' ')"
        printf '\n-- git status --short --\n'
        git -C "$REPO_ROOT" status --short 2>/dev/null || true
    } >"$file"

    printf 'Recorded change journal entry: %s\n' "$file"
}

case "$ACTION" in
    append)
        append_entry "$@"
        ;;
    list)
        latest_entries "${2:-20}"
        ;;
    path)
        printf '%s\n' "$JOURNAL_DIR"
        ;;
    *)
        echo "Usage: ./jeannie change-journal {list [count]|path}" >&2
        echo "Internal: scripts/change-journal append <command> [detail]" >&2
        exit 1
        ;;
esac
