#!/usr/bin/env bash
# ==============================================================================
# SCRIPT DEPLOY OTOMATIS BACKEND API LIMIKO (LARAVEL 11 & PHP 8.3) PADA VPS UBUNTU
# Target OS: Ubuntu 22.04 LTS / Ubuntu 24.04 LTS
# Domain API: api-app.limiko.id
# ==============================================================================

set -e

# Warna Terminal
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${BLUE}======================================================================${NC}"
echo -e "${BLUE}     MEMULAI DEPLOYMENT BACKEND API LIMIKO (LARAVEL 11) KE VPS       ${NC}"
echo -e "${BLUE}======================================================================${NC}"

# 1. Validasi Root
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}[ERROR] Script ini harus dijalankan sebagai root (gunakan: sudo bash vps-deploy.sh)${NC}"
  exit 1
fi

DOMAIN="api-app.limiko.id"
WEB_ROOT="/var/www/api-app.limiko.id"
DB_NAME="limiko_db"
DB_USER="limiko_user"
DB_PASS="LimikoSecretSecurePass2026!"

echo -e "\n${YELLOW}[1/8] Memperbarui Repositori Sistem & Paket Dasar...${NC}"
apt update && apt upgrade -y
apt install -y software-properties-common curl git unzip zip ufw certbot python3-certbot-nginx

echo -e "\n${YELLOW}[2/8] Menambahkan Repositori Ondrej PHP & Instalasi PHP 8.3...${NC}"
add-apt-repository -y ppa:ondrej/php
apt update
apt install -y php8.3-fpm php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml \
  php8.3-curl php8.3-zip php8.3-bcmath php8.3-intl php8.3-fileinfo php8.3-opcache

# 3. Instalasi Composer
echo -e "\n${YELLOW}[3/8] Memeriksa & Menginstal Composer...${NC}"
if ! command -v composer &> /dev/null; then
    curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
    php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
    rm /tmp/composer-setup.php
    echo -e "${GREEN}Composer berhasil diinstal.${NC}"
else
    echo -e "${GREEN}Composer sudah terinstal.${NC}"
fi

# 4. Instalasi & Setup MySQL Server
echo -e "\n${YELLOW}[4/8] Menyiapkan Database MySQL 8.0...${NC}"
if ! command -v mysql &> /dev/null; then
    apt install -y mysql-server
    systemctl enable mysql
    systemctl start mysql
fi

echo -e "Membuat Database & User MySQL..."
mysql -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -e "CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';"
mysql -e "GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO '${DB_USER}'@'localhost';"
mysql -e "FLUSH PRIVILEGES;"
echo -e "${GREEN}Database [${DB_NAME}] dan Pengguna [${DB_USER}] siap!${NC}"

# 5. Menyiapkan Direktori & File Proyek
echo -e "\n${YELLOW}[5/8] Menyiapkan Folder Aplikasi di ${WEB_ROOT}...${NC}"
mkdir -p "${WEB_ROOT}"

# Jika folder saat ini berisi kode proyek, salin ke web root
CURRENT_DIR=$(pwd)
if [ -f "$CURRENT_DIR/artisan" ]; then
    echo -e "Menyalin file proyek dari folder saat ini ke ${WEB_ROOT}..."
    cp -r "$CURRENT_DIR/." "${WEB_ROOT}/"
fi

cd "${WEB_ROOT}"

# Setup File .env
if [ ! -f "${WEB_ROOT}/.env" ]; then
    echo -e "Membuat konfigurasi .env untuk produksi..."
    if [ -f "${WEB_ROOT}/.env.production.example" ]; then
        cp "${WEB_ROOT}/.env.production.example" "${WEB_ROOT}/.env"
    else
        cp "${WEB_ROOT}/.env.example" "${WEB_ROOT}/.env"
    fi

    # Sesuaikan konfigurasi database di .env
    sed -i "s/DB_CONNECTION=.*/DB_CONNECTION=mysql/" "${WEB_ROOT}/.env"
    sed -i "s/DB_HOST=.*/DB_HOST=127.0.0.1/" "${WEB_ROOT}/.env"
    sed -i "s/DB_PORT=.*/DB_PORT=3306/" "${WEB_ROOT}/.env"
    sed -i "s/DB_DATABASE=.*/DB_DATABASE=${DB_NAME}/" "${WEB_ROOT}/.env"
    sed -i "s/DB_USERNAME=.*/DB_USERNAME=${DB_USER}/" "${WEB_ROOT}/.env"
    sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${DB_PASS}/" "${WEB_ROOT}/.env"
    sed -i "s|APP_URL=.*|APP_URL=https://${DOMAIN}|" "${WEB_ROOT}/.env"
fi

# 6. Install Dependencies & Build
echo -e "\n${YELLOW}[6/8] Menginstal Dependensi PHP & Menjalankan Migrasi Data...${NC}"
composer install --no-dev --optimize-autoloader --no-interaction

php artisan key:generate --force

# Import database SQL dump atau jalankan migrasi seeder
if [ -f "${WEB_ROOT}/database/sql/dump1.sql" ]; then
    echo -e "Mengimpor skema relasional lengkap dari database/sql/dump1.sql..."
    mysql -u "${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" < "${WEB_ROOT}/database/sql/dump1.sql" || php artisan limiko:import-sql
else
    php artisan migrate --force
    php artisan db:seed --force
fi

php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Set Hak Akses Kepemilikan Web Server
chown -R www-data:www-data "${WEB_ROOT}"
chmod -R 775 "${WEB_ROOT}/storage" "${WEB_ROOT}/bootstrap/cache"

# 7. Konfigurasi Nginx
echo -e "\n${YELLOW}[7/8] Mengonfigurasi Virtual Host Nginx...${NC}"
apt install -y nginx

NGINX_CONF="/etc/nginx/sites-available/${DOMAIN}"
cat << 'EOF' > "${NGINX_CONF}"
server {
    listen 80;
    listen [::]:80;
    server_name api-app.limiko.id;

    root /var/www/api-app.limiko.id/public;
    index index.php index.html;

    client_max_body_size 64M;

    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/json;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_read_timeout 300;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
EOF

ln -sf "${NGINX_CONF}" /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

# 8. Setup SSL Certbot & Cron Laravel
echo -e "\n${YELLOW}[8/8] Mengaktifkan Cron Scheduler & SSL Otomatis...${NC}"
# Tambah Laravel cron ke crontab www-data
CRON_JOB="* * * * * cd ${WEB_ROOT} && php artisan schedule:run >> /dev/null 2>&1"
(crontab -u www-data -l 2>/dev/null | grep -F -v "artisan schedule:run" ; echo "$CRON_JOB") | crontab -u www-data -

echo -e "\n${BLUE}======================================================================${NC}"
echo -e "${GREEN}    SELAMAT! BACKEND API LIMIKO BERHASIL DI-DEPLOY DI VPS ANDA!      ${NC}"
echo -e "${BLUE}======================================================================${NC}"
echo -e "Lokasi Aplikasi : ${WEB_ROOT}"
echo -e "Domain API      : http://${DOMAIN}"
echo -e "Database        : MySQL (${DB_NAME})"
echo -e "\n${YELLOW}Langkah Terakhir: Untuk mengaktifkan sertifikat SSL HTTPS gratis (Let's Encrypt), jalankan:${NC}"
echo -e "  certbot --nginx -d ${DOMAIN} --non-interactive --agree-tos -m admin@ppalikhlas.com"
echo -e "\nSetelah itu API Anda aktif di: ${GREEN}https://${DOMAIN}${NC}"