#!/bin/bash

# ============================================================
#  AUTO BACKUP SCRIPT
#  Database + Source Code + Mail
#  Kirim via SMTP (curl), auto delete setelah terkirim
# ============================================================

# --- KONFIGURASI ---
DB_HOST="127.0.0.1"
DB_PORT="3306"
DB_NAME="gokh6873_internal_catering"
DB_USER="gokh6873_fathih"
DB_PASS="gokaiohsama"

SOURCE_DIR="/home/gokh6873/public_html/catering.gokaitech.my.id"
MAIL_DIRS="/home/gokh6873/mail /home/gokh6873/Maildir"

BACKUP_DIR="/home/gokh6873/public_html/cron.gokaitech.my.id"
LOG_FILE="/home/gokh6873/public_html/cron.gokaitech.my.id/backup.log"

SMTP_HOST="mail.gokaitech.my.id"
SMTP_PORT_TLS="587"
SMTP_PORT_SSL="465"
SMTP_USER="noreply@gokaitech.my.id"
SMTP_PASS='mHEjqL)JQ.cz.u[;'
MAIL_FROM="noreply@gokaitech.my.id"
MAIL_TO="fathihapriandi@gokaitech.my.id"

# --- INISIALISASI ---
mkdir -p "$BACKUP_DIR"
DATE=$(date '+%Y-%m-%d_%H-%M-%S')
ERRORS=0

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

log "=================================================="
log "MULAI PROSES BACKUP - $DATE"
log "=================================================="

# --- 1. BACKUP DATABASE ---
log "[DB] Memulai backup database: $DB_NAME"
DB_FILE="$BACKUP_DIR/db_${DB_NAME}_${DATE}.sql"
DB_ZIP="$BACKUP_DIR/db_${DB_NAME}_${DATE}.zip"

mysqldump \
    -h "$DB_HOST" \
    -P "$DB_PORT" \
    -u "$DB_USER" \
    -p"$DB_PASS" \
    --single-transaction \
    --routines \
    --triggers \
    "$DB_NAME" > "$DB_FILE" 2>> "$LOG_FILE"

if [ $? -eq 0 ] && [ -s "$DB_FILE" ]; then
    zip -j "$DB_ZIP" "$DB_FILE" >> "$LOG_FILE" 2>&1
    rm -f "$DB_FILE"
    DB_SIZE=$(du -sh "$DB_ZIP" | cut -f1)
    log "[DB] ✓ Backup database berhasil - $DB_SIZE"
else
    log "[DB] ✗ GAGAL backup database!"
    ERRORS=$((ERRORS + 1))
    rm -f "$DB_FILE"
fi

# --- 2. BACKUP SOURCE CODE ---
log "[SRC] Memulai backup source code: $SOURCE_DIR"
SRC_ZIP="$BACKUP_DIR/src_catering_${DATE}.zip"

if [ -d "$SOURCE_DIR" ]; then
    zip -r "$SRC_ZIP" "$SOURCE_DIR" \
        --exclude "*.log" \
        --exclude "*/.git/*" \
        --exclude "*/node_modules/*" \
        --exclude "*/vendor/*" \
        >> "$LOG_FILE" 2>&1

    if [ $? -eq 0 ]; then
        SRC_SIZE=$(du -sh "$SRC_ZIP" | cut -f1)
        log "[SRC] ✓ Backup source code berhasil - $SRC_SIZE"
    else
        log "[SRC] ✗ GAGAL backup source code!"
        ERRORS=$((ERRORS + 1))
    fi
else
    log "[SRC] ✗ Folder tidak ditemukan: $SOURCE_DIR"
    ERRORS=$((ERRORS + 1))
fi

# --- 3. BACKUP MAIL ---
log "[MAIL] Memulai backup mail..."
MAIL_ZIP="$BACKUP_DIR/mail_${DATE}.zip"
MAIL_FOUND=0

for MDIR in $MAIL_DIRS; do
    if [ -d "$MDIR" ]; then
        log "[MAIL] Ditemukan folder mail: $MDIR"
        zip -r "$MAIL_ZIP" "$MDIR" >> "$LOG_FILE" 2>&1
        MAIL_FOUND=1
        break
    fi
done

if [ $MAIL_FOUND -eq 1 ] && [ -f "$MAIL_ZIP" ]; then
    MAIL_SIZE=$(du -sh "$MAIL_ZIP" | cut -f1)
    log "[MAIL] ✓ Backup mail berhasil - $MAIL_SIZE"
else
    log "[MAIL] ! Folder mail tidak ditemukan, skip."
fi

# --- 4. KIRIM EMAIL VIA CURL SMTP ---
log "[EMAIL] Menyiapkan pengiriman email..."

# Kumpulkan file backup yang berhasil
ATTACHMENTS=""
ATTACH_LIST=""
for F in "$DB_ZIP" "$SRC_ZIP" "$MAIL_ZIP"; do
    if [ -f "$F" ]; then
        FNAME=$(basename "$F")
        FSIZE=$(du -sh "$F" | cut -f1)
        ATTACHMENTS="$ATTACHMENTS $F"
        ATTACH_LIST="$ATTACH_LIST\n  - $FNAME ($FSIZE)"
    fi
done

if [ $ERRORS -eq 0 ]; then
    STATUS_TEXT="SEMUA BACKUP BERHASIL"
else
    STATUS_TEXT="BACKUP SELESAI DENGAN $ERRORS ERROR"
fi

# Build MIME email dengan attachment
BOUNDARY="==BACKUP_$(date +%s)=="
TMPMAIL=$(mktemp /tmp/backupmail.XXXXXX)

{
    echo "From: GoKai Backup <$MAIL_FROM>"
    echo "To: $MAIL_TO"
    echo "Subject: [AUTO BACKUP] $STATUS_TEXT - $DATE"
    echo "MIME-Version: 1.0"
    echo "Content-Type: multipart/mixed; boundary=\"$BOUNDARY\""
    echo ""
    echo "--$BOUNDARY"
    echo "Content-Type: text/plain; charset=UTF-8"
    echo ""
    echo "AUTO BACKUP REPORT"
    echo "=================="
    echo "Tanggal  : $(date '+%d %B %Y %H:%M:%S')"
    echo "Status   : $STATUS_TEXT"
    echo ""
    echo "File Backup:"
    echo -e "$ATTACH_LIST"
    echo ""
    echo "Log lengkap:"
    echo "https://cron.gokaitech.my.id/backup.log"
    echo ""
    echo "--"
    echo "GoKai Tech Auto Backup System"

    # Lampirkan setiap file
    for F in $ATTACHMENTS; do
        FNAME=$(basename "$F")
        echo ""
        echo "--$BOUNDARY"
        echo "Content-Type: application/zip; name=\"$FNAME\""
        echo "Content-Transfer-Encoding: base64"
        echo "Content-Disposition: attachment; filename=\"$FNAME\""
        echo ""
        base64 "$F"
    done

    echo ""
    echo "--$BOUNDARY--"
} > "$TMPMAIL"

# Coba kirim via TLS (port 587) dulu
send_email() {
    local PORT=$1
    local PROTOCOL=$2
    curl --silent --show-error \
        --url "${PROTOCOL}://${SMTP_HOST}:${PORT}" \
        --ssl-reqd \
        --mail-from "$MAIL_FROM" \
        --mail-rcpt "$MAIL_TO" \
        --user "${SMTP_USER}:${SMTP_PASS}" \
        --upload-file "$TMPMAIL" \
        --insecure \
        >> "$LOG_FILE" 2>&1
}

log "[EMAIL] Mencoba kirim via TLS port $SMTP_PORT_TLS..."
send_email "$SMTP_PORT_TLS" "smtp"

if [ $? -eq 0 ]; then
    log "[EMAIL] ✓ Email berhasil dikirim via TLS ke $MAIL_TO"
    EMAIL_SENT=1
else
    log "[EMAIL] ! TLS gagal, mencoba SSL port $SMTP_PORT_SSL..."
    send_email "$SMTP_PORT_SSL" "smtps"

    if [ $? -eq 0 ]; then
        log "[EMAIL] ✓ Email berhasil dikirim via SSL ke $MAIL_TO"
        EMAIL_SENT=1
    else
        log "[EMAIL] ✗ GAGAL kirim email via TLS maupun SSL!"
        EMAIL_SENT=0
        ERRORS=$((ERRORS + 1))
    fi
fi

rm -f "$TMPMAIL"

# --- 5. HAPUS FILE BACKUP (hanya kalau email terkirim) ---
if [ $EMAIL_SENT -eq 1 ]; then
    log "[CLEAN] Menghapus file backup..."
    for F in $ATTACHMENTS; do
        rm -f "$F"
        log "[CLEAN] ✓ Dihapus: $(basename $F)"
    done
else
    log "[CLEAN] ! Email gagal - file backup TIDAK dihapus, cek manual di $BACKUP_DIR"
fi

# --- SELESAI ---
log "=================================================="
log "SELESAI - Total error: $ERRORS"
log "=================================================="