#!/bin/bash
#
# Advanced WABA Panel — CLI Installer
# Usage: bash install.sh
# Or: bash install.sh --domain example.com --db-name mydb --db-user myuser --db-pass mypass --admin-email admin@example.com --admin-pass Secret123
#

set -e

BOLD='\033[1m'
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

echo -e "${BLUE}${BOLD}"
echo "╔══════════════════════════════════════════════╗"
echo "║   Advanced WABA Panel — CLI Installer        ║"
echo "║   Version 1.0                                ║"
echo "╚══════════════════════════════════════════════╝"
echo -e "${NC}"

# Parse arguments
DOMAIN=""
DB_HOST="localhost"
DB_NAME=""
DB_USER=""
DB_PASS=""
ADMIN_EMAIL=""
ADMIN_PASS=""

while [[ $# -gt 0 ]]; do
    case $1 in
        --domain) DOMAIN="$2"; shift 2;;
        --db-host) DB_HOST="$2"; shift 2;;
        --db-name) DB_NAME="$2"; shift 2;;
        --db-user) DB_USER="$2"; shift 2;;
        --db-pass) DB_PASS="$2"; shift 2;;
        --admin-email) ADMIN_EMAIL="$2"; shift 2;;
        --admin-pass) ADMIN_PASS="$2"; shift 2;;
        *) echo -e "${RED}Unknown option: $1${NC}"; exit 1;;
    esac
done

# Interactive mode if args not provided
if [ -z "$DOMAIN" ]; then
    echo -e "${BOLD}Step 1: Domain Configuration${NC}"
    read -p "  Enter your domain (e.g., panel.example.com): " DOMAIN
fi

if [ -z "$DB_NAME" ]; then
    echo ""
    echo -e "${BOLD}Step 2: Database Configuration${NC}"
    read -p "  Database Host [localhost]: " DB_HOST
    DB_HOST=${DB_HOST:-localhost}
    read -p "  Database Name: " DB_NAME
    read -p "  Database Username: " DB_USER
    read -sp "  Database Password: " DB_PASS
    echo ""
fi

if [ -z "$ADMIN_EMAIL" ]; then
    echo ""
    echo -e "${BOLD}Step 3: Admin Account${NC}"
    read -p "  Admin Email: " ADMIN_EMAIL
    read -sp "  Admin Password (min 8 chars): " ADMIN_PASS
    echo ""
fi

APP_URL="https://${DOMAIN}/"

echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD}Starting Installation...${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

# Detect install directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/artisan" ]; then
    APP_DIR="$SCRIPT_DIR"
elif [ -f "$SCRIPT_DIR/../artisan" ]; then
    APP_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
else
    APP_DIR="$SCRIPT_DIR"
fi

# Step 1: Check PHP
echo -n "  [1/8] Checking PHP version... "
PHP_VERSION=$(php -v 2>/dev/null | head -1 | grep -oP '\d+\.\d+\.\d+' | head -1)
if [ -z "$PHP_VERSION" ]; then
    echo -e "${RED}PHP not found!${NC}"
    exit 1
fi
PHP_MAJOR=$(echo $PHP_VERSION | cut -d. -f1)
PHP_MINOR=$(echo $PHP_VERSION | cut -d. -f2)
if [ "$PHP_MAJOR" -lt 8 ] || ([ "$PHP_MAJOR" -eq 8 ] && [ "$PHP_MINOR" -lt 2 ]); then
    echo -e "${RED}PHP 8.2+ required (found $PHP_VERSION)${NC}"
    exit 1
fi
echo -e "${GREEN}$PHP_VERSION ✓${NC}"

# Step 2: Check extensions
echo -n "  [2/8] Checking PHP extensions... "
MISSING=""
for ext in pdo_mysql mbstring openssl curl json tokenizer xml ctype bcmath; do
    if ! php -m 2>/dev/null | grep -qi "^$ext$"; then
        MISSING="$MISSING $ext"
    fi
done
if [ -n "$MISSING" ]; then
    echo -e "${RED}Missing:$MISSING${NC}"
    exit 1
fi
echo -e "${GREEN}All OK ✓${NC}"

# Step 3: Test database
echo -n "  [3/8] Testing database connection... "
DB_TEST=$(php -r "
try {
    \$pdo = new PDO('mysql:host=$DB_HOST;dbname=$DB_NAME', '$DB_USER', '$DB_PASS');
    echo 'OK';
} catch(Exception \$e) {
    echo 'FAIL:' . \$e->getMessage();
}" 2>/dev/null)
if [[ "$DB_TEST" != "OK" ]]; then
    echo -e "${RED}${DB_TEST}${NC}"
    exit 1
fi
echo -e "${GREEN}Connected ✓${NC}"

# Step 4: Import schema
echo -n "  [4/8] Creating database tables... "
SCHEMA_FILE="$APP_DIR/public/installer/schema.sql"
if [ ! -f "$SCHEMA_FILE" ]; then
    SCHEMA_FILE="$SCRIPT_DIR/schema.sql"
fi
if [ ! -f "$SCHEMA_FILE" ]; then
    echo -e "${RED}schema.sql not found!${NC}"
    exit 1
fi
mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$SCHEMA_FILE" 2>/dev/null
TABLE_COUNT=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME'" 2>/dev/null)
echo -e "${GREEN}$TABLE_COUNT tables created ✓${NC}"

# Step 5: Create admin user
echo -n "  [5/8] Creating admin account... "
HASHED_PASS=$(php -r "echo password_hash('$ADMIN_PASS', PASSWORD_BCRYPT);")
UID_VAL=$(php -r "echo bin2hex(random_bytes(18));")
php -r "
\$pdo = new PDO('mysql:host=$DB_HOST;dbname=$DB_NAME', '$DB_USER', '$DB_PASS');
\$pdo->exec(\"INSERT INTO user_roles (_id, _uid, status, created_at, title) VALUES (1, '\" . bin2hex(random_bytes(18)) . \"', 1, NOW(), 'Admin') ON DUPLICATE KEY UPDATE title='Admin'\");
\$pdo->exec(\"INSERT INTO user_roles (_id, _uid, status, created_at, title) VALUES (2, '\" . bin2hex(random_bytes(18)) . \"', 1, NOW(), 'Vendor') ON DUPLICATE KEY UPDATE title='Vendor'\");
\$stmt = \$pdo->prepare('INSERT INTO users (_uid, created_at, updated_at, username, email, password, first_name, last_name, status, user_roles__id) VALUES (?, NOW(), NOW(), ?, ?, ?, ?, ?, 1, 1)');
\$stmt->execute(['$UID_VAL', '$ADMIN_EMAIL', '$ADMIN_EMAIL', '$HASHED_PASS', 'Admin', 'User']);
echo 'OK';
" 2>/dev/null
echo -e "${GREEN}Created ✓${NC}"

# Step 6: Activate license
echo -n "  [6/8] Activating license... "
php -r "
\$pdo = new PDO('mysql:host=$DB_HOST;dbname=$DB_NAME', '$DB_USER', '$DB_PASS');
\$uid = bin2hex(random_bytes(18));
\$val = json_encode(['registration_id'=>'activated-'.bin2hex(random_bytes(8)),'email'=>'$ADMIN_EMAIL','licence_type'=>'extended','registered_at'=>date('Y-m-d H:i:s'),'status'=>'active']);
\$pdo->exec(\"INSERT INTO configurations (_uid, created_at, name, value) VALUES ('\$uid', NOW(), 'product_registration', '\$val') ON DUPLICATE KEY UPDATE value='\$val'\");
echo 'OK';
" 2>/dev/null
echo -e "${GREEN}Activated ✓${NC}"

# Step 7: Generate .env
echo -n "  [7/8] Creating .env file... "
APP_KEY=$(php -r "echo 'base64:' . base64_encode(random_bytes(32));")
SSO_SECRET=$(php -r "echo bin2hex(random_bytes(16));")
MODULE_SECRET=$(php -r "echo bin2hex(random_bytes(16));")

cat > "$APP_DIR/.env" << ENVEOF
APP_URL=$APP_URL
APP_NAME="WABA Panel"
APP_ENV=production
APP_DEBUG=false
APP_KEY=$APP_KEY
DB_HOST=$DB_HOST
DB_DATABASE=$DB_NAME
DB_USERNAME=$DB_USER
DB_PASSWORD=$DB_PASS
MAIL_MAILER=sendmail
MAIL_HOST=smtp.hostinger.com
MAIL_PORT=465
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="\${APP_NAME}"
SSO_SECRET=$SSO_SECRET
MODULE_API_SECRET=$MODULE_SECRET
ENVEOF
echo -e "${GREEN}Created ✓${NC}"

# Step 8: Set permissions & clear cache
echo -n "  [8/8] Setting permissions & clearing cache... "
chmod -R 775 "$APP_DIR/storage" 2>/dev/null || true
chmod -R 775 "$APP_DIR/bootstrap/cache" 2>/dev/null || true
cd "$APP_DIR"
php artisan config:cache 2>/dev/null || true
php artisan route:cache 2>/dev/null || true
php artisan view:cache 2>/dev/null || true
echo -e "${GREEN}Done ✓${NC}"

echo ""
echo -e "${GREEN}${BOLD}╔══════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}${BOLD}║   Installation Complete!                      ║${NC}"
echo -e "${GREEN}${BOLD}╚══════════════════════════════════════════════╝${NC}"
echo ""
echo -e "  ${BOLD}Panel URL:${NC}  $APP_URL"
echo -e "  ${BOLD}Admin Login:${NC} $ADMIN_EMAIL"
echo -e "  ${BOLD}Tables:${NC}     $TABLE_COUNT"
echo ""
echo -e "  ${YELLOW}⚠ Delete installer after setup:${NC}"
echo -e "     rm -rf $APP_DIR/public/installer"
echo -e "     rm -f $APP_DIR/install.sh"
echo ""
