#!/bin/bash
# ═══════════════════════════════════════════════════════════════════
#  SVC Elektronik — Docker Container Auto-Setup Entrypoint
#  Setiap kali container start, jalankan langkah berikut secara berurutan:
#  1. Pastikan storage directory ada + permission benar
#  2. Copy .env.docker → .env (jika belum ada)
#  3. Generate APP_KEY jika kosong
#  4. Composer install jika vendor belum lengkap
#  5. NPM install + build (jika ada package.json)
#  6. Tunggu MySQL siap
#  7. Pastikan database ada + buat user kalau perlu
#  8. Jalankan migrate + seed (hanya pada DB kosong / pertama kali)
#  9. Storage symlink
#  10. Clear cache (config, view, cache, route)
#  11. Final permission fix → start Apache
# ═══════════════════════════════════════════════════════════════════
set -e

cd /var/www/html

C_RESET="\033[0m"
C_OK="\033[0;32m"
C_INFO="\033[0;36m"
C_WARN="\033[0;33m"

log()  { echo -e "${C_INFO}[entrypoint]${C_RESET} $*"; }
ok()   { echo -e "  ${C_OK}✓${C_RESET} $*"; }
warn() { echo -e "  ${C_WARN}⚠${C_RESET} $*"; }

echo "═══════════════════════════════════════════════════════════════"
echo "  SVC Elektronik — Auto Setup ($(date +%H:%M:%S))"
echo "═══════════════════════════════════════════════════════════════"

# ─── 1. Storage directories + permissions ────────────────────────
log "[1/11] Menyiapkan storage directories..."
mkdir -p \
    storage/framework/cache/data \
    storage/framework/sessions \
    storage/framework/views \
    storage/logs \
    storage/app/public \
    bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || true
chmod -R 775 storage bootstrap/cache 2>/dev/null || true
ok "Storage siap (owner: www-data, mode: 775)"

# ─── 2. Setup .env file ──────────────────────────────────────────
log "[2/11] Menyiapkan file .env..."
if [ ! -f .env ]; then
    if [ -f .env.docker ]; then
        cp .env.docker .env
        ok ".env dibuat dari .env.docker"
    elif [ -f .env.example ]; then
        cp .env.example .env
        warn ".env dibuat dari .env.example (cek DB_HOST mungkin perlu di-set ke 'db')"
    else
        echo "  ✗ .env.docker dan .env.example tidak ditemukan!"
        exit 1
    fi
else
    ok ".env sudah ada"
fi

# ─── 3. APP_KEY ──────────────────────────────────────────────────
log "[3/11] Memeriksa APP_KEY..."
if ! grep -q "^APP_KEY=base64:" .env; then
    php artisan key:generate --no-interaction --force >/dev/null
    ok "APP_KEY berhasil di-generate"
else
    ok "APP_KEY sudah ada"
fi

# ─── 4a. Composer dependencies ───────────────────────────────────
log "[4/11] Memeriksa composer dependencies..."
NEED_INSTALL="false"
if [ "${AUTO_COMPOSER:-auto}" = "always" ]; then
    NEED_INSTALL="true"
elif [ ! -f vendor/autoload.php ]; then
    NEED_INSTALL="true"
elif [ "${AUTO_COMPOSER:-auto}" = "auto" ] && [ composer.lock -nt vendor/autoload.php ] 2>/dev/null; then
    NEED_INSTALL="true"
fi

if [ "$NEED_INSTALL" = "true" ]; then
    log "  → Menjalankan composer install..."
    composer install --no-interaction --prefer-dist --optimize-autoloader --no-progress 2>&1 | tail -5
    ok "Composer install selesai"
else
    ok "Vendor sudah lengkap (skip composer install)"
fi

# ─── 4b. NPM dependencies + asset build ──────────────────────────
log "[5/11] Memeriksa frontend assets (npm)..."
if [ ! -f package.json ]; then
    ok "Tidak ada package.json — skip npm (asset di-load via CDN)"
else
    NEED_NPM="false"
    if [ "${AUTO_NPM:-auto}" = "always" ]; then
        NEED_NPM="true"
    elif [ ! -d node_modules ] || [ ! -f node_modules/.package-lock.json ]; then
        NEED_NPM="true"
    elif [ "${AUTO_NPM:-auto}" = "auto" ] && [ package-lock.json -nt node_modules/.package-lock.json ] 2>/dev/null; then
        NEED_NPM="true"
    fi

    if [ "$NEED_NPM" = "true" ]; then
        log "  → Menjalankan npm install..."
        npm install --no-audit --no-fund --silent 2>&1 | tail -5
        ok "npm install selesai"
    else
        ok "node_modules sudah lengkap (skip npm install)"
    fi

    # Build asset jika ada script "build" di package.json
    if grep -q '"build"' package.json; then
        # Skip build jika asset sudah ada di public/build dan terbaru
        if [ ! -d public/build ] || [ "${AUTO_NPM:-auto}" = "always" ] || \
           [ -f resources/css/app.css -a resources/css/app.css -nt public/build ] 2>/dev/null; then
            log "  → Menjalankan npm run build..."
            npm run build 2>&1 | tail -5
            ok "Asset build selesai → public/build"
        else
            ok "Asset sudah ter-build (skip npm run build)"
        fi
    fi
fi

# ─── 5. Tunggu MySQL siap ────────────────────────────────────────
DB_HOST_VAL="${DB_HOST:-db}"
DB_PORT_VAL="${DB_PORT:-3306}"
DB_USER_VAL="${DB_USERNAME:-root}"
DB_PASS_VAL="${DB_PASSWORD:-root}"
DB_NAME_VAL="${DB_DATABASE:-svc}"

log "[6/11] Menunggu MySQL di ${DB_HOST_VAL}:${DB_PORT_VAL}..."
RETRIES=60
until php -r "
try {
    new PDO('mysql:host=${DB_HOST_VAL};port=${DB_PORT_VAL}', '${DB_USER_VAL}', '${DB_PASS_VAL}');
    exit(0);
} catch (Exception \$e) { exit(1); }
" 2>/dev/null; do
    RETRIES=$((RETRIES - 1))
    if [ "$RETRIES" -le 0 ]; then
        echo "  ✗ Tidak bisa konek ke MySQL setelah 60 percobaan"
        exit 1
    fi
    sleep 2
done
ok "MySQL siap"

# ─── 6. Pastikan database + user ada ─────────────────────────────
log "[7/11] Memastikan database '${DB_NAME_VAL}' ada..."
php -r "
\$pdo = new PDO('mysql:host=${DB_HOST_VAL};port=${DB_PORT_VAL}', 'root', '${DB_PASS_VAL}');
\$pdo->exec('CREATE DATABASE IF NOT EXISTS \`${DB_NAME_VAL}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci');
echo 'database ok';
" >/dev/null
ok "Database '${DB_NAME_VAL}' siap"

# Buat user non-root jika DB_USERNAME bukan 'root'
if [ "${DB_USER_VAL}" != "root" ]; then
    log "  → Memastikan user '${DB_USER_VAL}' ada..."
    php -r "
    \$pdo = new PDO('mysql:host=${DB_HOST_VAL};port=${DB_PORT_VAL}', 'root', '${DB_PASS_VAL}');
    \$pdo->exec(\"CREATE USER IF NOT EXISTS '${DB_USER_VAL}'@'%' IDENTIFIED BY '${DB_PASS_VAL}'\");
    \$pdo->exec(\"GRANT ALL PRIVILEGES ON \\\`${DB_NAME_VAL}\\\`.* TO '${DB_USER_VAL}'@'%'\");
    \$pdo->exec('FLUSH PRIVILEGES');
    " 2>/dev/null && ok "User '${DB_USER_VAL}' siap dengan grant ke '${DB_NAME_VAL}'"
fi

# ─── 7. Migrate ──────────────────────────────────────────────────
if [ "${AUTO_MIGRATE:-true}" = "true" ]; then
    log "[8/11] Menjalankan migrasi database..."

    USERS_EXIST=$(php -r "
    try {
        \$pdo = new PDO('mysql:host=${DB_HOST_VAL};port=${DB_PORT_VAL};dbname=${DB_NAME_VAL}', '${DB_USER_VAL}', '${DB_PASS_VAL}');
        \$r = \$pdo->query(\"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '${DB_NAME_VAL}' AND table_name = 'users'\")->fetchColumn();
        if (\$r > 0) {
            \$c = \$pdo->query('SELECT COUNT(*) FROM users')->fetchColumn();
            echo \$c > 0 ? '1' : '0';
        } else echo '0';
    } catch (Exception \$e) { echo '0'; }
    " 2>/dev/null)

    if [ "$USERS_EXIST" = "0" ] && [ "${AUTO_SEED:-true}" = "true" ]; then
        log "  → Database kosong → migrate:fresh + seed..."
        php artisan migrate:fresh --seed --force 2>&1 | tail -20
        ok "Migrate + seed selesai"
    else
        log "  → Menjalankan migrasi pending..."
        php artisan migrate --force 2>&1 | tail -10 || warn "Beberapa migrasi gagal (mungkin sudah dijalankan)"
        ok "Migrasi selesai"
    fi
else
    ok "AUTO_MIGRATE=false → skip migrasi"
fi

# ─── 8. Storage link ─────────────────────────────────────────────
log "[9/11] Storage symlink..."
if [ ! -L public/storage ]; then
    php artisan storage:link >/dev/null 2>&1 && ok "Storage link dibuat" || ok "Storage link sudah ada"
else
    ok "Storage link sudah ada"
fi

# ─── 9. Clear & optimize cache ───────────────────────────────────
log "[10/11] Membersihkan cache..."
php artisan config:clear  2>/dev/null || true
php artisan view:clear    2>/dev/null || true
php artisan cache:clear   2>/dev/null || true
php artisan route:clear   2>/dev/null || true
ok "Semua cache cleared"

# Optimize autoloader
if [ -f vendor/autoload.php ]; then
    composer dump-autoload --optimize --quiet 2>/dev/null || true
fi

# ─── 10. Final permission + start Apache ─────────────────────────
log "[11/11] Final permission check..."
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || true
chmod -R 775 storage bootstrap/cache 2>/dev/null || true
ok "Permission final OK"

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo -e "  ${C_OK}✓ Setup selesai!${C_RESET} Apache akan start..."
echo "  → URL:   http://localhost:${APP_PORT:-8000}"
echo "  → DB:    ${DB_NAME_VAL} @ ${DB_HOST_VAL} (port host: ${DB_PORT_EXTERNAL:-3307})"
echo "  → Login: admin@service.com / admin123"
echo "═══════════════════════════════════════════════════════════════"
echo ""

exec "$@"
