#!/bin/bash
#
# backup-crontab.sh - Crontab entries backup
#
# Exports crontab entries from:
# - Host system (root crontab)
# - WordPress container crontab
# - /etc/cron.d/ entries from container
#

set -euo pipefail

# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKUP_ROOT="$(dirname "$SCRIPT_DIR")"
STORAGE_DIR="$BACKUP_ROOT/storage/crontab"
LOG_FILE="$BACKUP_ROOT/logs/backup.log"

# Container settings
WP_CONTAINER_NAME="parketry_wp"

# Timestamp format for backup files
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$STORAGE_DIR/backup_${TIMESTAMP}.txt"
LATEST_LINK="$STORAGE_DIR/latest.txt"

# Logging function
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [CRONTAB] $1" | tee -a "$LOG_FILE"
}

# Error handler (non-fatal for crontab - we want to capture what we can)
log_warning() {
    log "WARNING: $1"
}

# Ensure storage directory exists
mkdir -p "$STORAGE_DIR"

log "Starting crontab backup..."

# Start backup file with header
{
    echo "=========================================="
    echo "CRONTAB BACKUP - $(date '+%Y-%m-%d %H:%M:%S')"
    echo "=========================================="
    echo ""
} > "$BACKUP_FILE"

# Backup host root crontab
{
    echo "=========================================="
    echo "HOST ROOT CRONTAB"
    echo "=========================================="
    if crontab -l 2>/dev/null; then
        :
    else
        echo "# No crontab entries for root"
    fi
    echo ""
} >> "$BACKUP_FILE"

# Backup host /etc/crontab
{
    echo "=========================================="
    echo "HOST /etc/crontab"
    echo "=========================================="
    if [[ -f /etc/crontab ]]; then
        cat /etc/crontab
    else
        echo "# /etc/crontab not found"
    fi
    echo ""
} >> "$BACKUP_FILE"

# Backup host /etc/cron.d/ entries
{
    echo "=========================================="
    echo "HOST /etc/cron.d/ ENTRIES"
    echo "=========================================="
    if [[ -d /etc/cron.d ]]; then
        for cronfile in /etc/cron.d/*; do
            if [[ -f "$cronfile" ]]; then
                echo "--- $cronfile ---"
                cat "$cronfile"
                echo ""
            fi
        done
    else
        echo "# /etc/cron.d/ directory not found"
    fi
    echo ""
} >> "$BACKUP_FILE"

# Backup WordPress container crontab (if container is running)
if docker ps --format '{{.Names}}' | grep -q "^${WP_CONTAINER_NAME}$"; then
    {
        echo "=========================================="
        echo "WORDPRESS CONTAINER CRONTAB (root)"
        echo "=========================================="
        if docker exec "$WP_CONTAINER_NAME" crontab -l 2>/dev/null; then
            :
        else
            echo "# No crontab entries in container"
        fi
        echo ""
    } >> "$BACKUP_FILE"

    # Backup container /etc/cron.d/ entries
    {
        echo "=========================================="
        echo "WORDPRESS CONTAINER /etc/cron.d/ ENTRIES"
        echo "=========================================="
        docker exec "$WP_CONTAINER_NAME" bash -c '
            if [[ -d /etc/cron.d ]]; then
                for cronfile in /etc/cron.d/*; do
                    if [[ -f "$cronfile" ]]; then
                        echo "--- $cronfile ---"
                        cat "$cronfile"
                        echo ""
                    fi
                done
            else
                echo "# /etc/cron.d/ directory not found in container"
            fi
        ' 2>/dev/null || echo "# Failed to read container cron.d entries"
        echo ""
    } >> "$BACKUP_FILE"
else
    log_warning "WordPress container $WP_CONTAINER_NAME is not running - skipping container crontab backup"
    {
        echo "=========================================="
        echo "WORDPRESS CONTAINER (NOT RUNNING)"
        echo "=========================================="
        echo "# Container $WP_CONTAINER_NAME was not running during backup"
        echo ""
    } >> "$BACKUP_FILE"
fi

# Update latest symlink
rm -f "$LATEST_LINK"
ln -s "$BACKUP_FILE" "$LATEST_LINK"

# Get human-readable size
HUMAN_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)

log "Crontab backup completed: $BACKUP_FILE ($HUMAN_SIZE)"

exit 0
