#!/bin/bash

# Complete fix for Meilisearch - handles all issues
set -e

echo "=========================================="
echo "Meilisearch Complete Fix"
echo "=========================================="
echo ""

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

if [ "$EUID" -ne 0 ]; then 
    echo -e "${RED}Please run as root or with sudo${NC}"
    exit 1
fi

# Step 1: Stop service
echo -e "${YELLOW}Step 1: Stopping service...${NC}"
systemctl stop meilisearch 2>/dev/null || true
sleep 2

# Step 2: Get service configuration
SERVICE_FILE="/etc/systemd/system/meilisearch.service"
if [ ! -f "$SERVICE_FILE" ]; then
    echo -e "${RED}Service file not found${NC}"
    exit 1
fi

CURRENT_USER=$(grep "^User=" "$SERVICE_FILE" | cut -d'=' -f2)
MASTER_KEY=$(grep "master-key=" "$SERVICE_FILE" | sed -n 's/.*--master-key="\([^"]*\)".*/\1/p')
DB_PATH=$(grep "db-path=" "$SERVICE_FILE" | sed -n 's/.*--db-path="\([^"]*\)".*/\1/p' || echo "/var/lib/meilisearch")

echo -e "${GREEN}User: $CURRENT_USER${NC}"
echo -e "${GREEN}Database path: $DB_PATH${NC}"
echo ""

# Step 3: Completely remove and recreate database directory
echo -e "${YELLOW}Step 2: Removing database directory completely...${NC}"
if [ -d "$DB_PATH" ]; then
    # Backup first
    if [ "$(ls -A $DB_PATH 2>/dev/null)" ]; then
        BACKUP_DIR="${DB_PATH}-backup-$(date +%Y%m%d-%H%M%S)"
        echo -e "${YELLOW}Creating backup at: $BACKUP_DIR${NC}"
        cp -a "$DB_PATH" "$BACKUP_DIR" 2>/dev/null || true
    fi
    
    # Remove entire directory
    rm -rf "$DB_PATH"
    echo -e "${GREEN}Directory removed${NC}"
fi

# Step 4: Recreate with proper permissions
echo -e "${YELLOW}Step 3: Creating fresh database directory...${NC}"
mkdir -p "$DB_PATH"
chown -R $CURRENT_USER:$CURRENT_USER "$DB_PATH"
chmod 755 "$DB_PATH"
echo -e "${GREEN}Directory created with proper permissions${NC}"

# Step 5: Verify permissions
echo -e "${YELLOW}Step 4: Verifying permissions...${NC}"
ls -ld "$DB_PATH"
echo ""

# Step 6: Test Meilisearch can write (run as user)
echo -e "${YELLOW}Step 5: Testing Meilisearch binary...${NC}"
if [ -f "/usr/local/bin/meilisearch" ]; then
    # Test if binary works
    /usr/local/bin/meilisearch --version
    echo -e "${GREEN}Binary is accessible${NC}"
else
    echo -e "${RED}Meilisearch binary not found at /usr/local/bin/meilisearch${NC}"
    exit 1
fi

# Step 7: Test manual run (as the service user)
echo -e "${YELLOW}Step 6: Testing manual run (will stop after 2 seconds)...${NC}"
timeout 2 su - $CURRENT_USER -c "/usr/local/bin/meilisearch --master-key=\"$MASTER_KEY\" --db-path=\"$DB_PATH\" --http-addr=\"127.0.0.1:7700\"" 2>&1 || true
echo ""

# Step 8: Update service file to ensure correct paths
echo -e "${YELLOW}Step 7: Updating service file...${NC}"
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Meilisearch
After=network.target

[Service]
Type=simple
User=$CURRENT_USER
Group=$CURRENT_USER
WorkingDirectory=$DB_PATH
ExecStart=/usr/local/bin/meilisearch --env="production" --master-key="$MASTER_KEY" --db-path="$DB_PATH" --http-addr="127.0.0.1:7700"
Restart=always
RestartSec=10
NoNewPrivileges=true
PrivateTmp=false
ReadWritePaths=$DB_PATH
StandardOutput=journal
StandardError=journal
SyslogIdentifier=meilisearch

[Install]
WantedBy=multi-user.target
EOF

echo -e "${GREEN}Service file updated${NC}"

# Step 9: Reload and start
echo ""
echo -e "${YELLOW}Step 8: Starting service...${NC}"
systemctl daemon-reload
systemctl start meilisearch

# Step 10: Wait and check
sleep 5
echo ""
echo -e "${YELLOW}Step 9: Checking status...${NC}"
if systemctl is-active --quiet meilisearch; then
    echo -e "${GREEN}✓ Meilisearch is running!${NC}"
    
    sleep 2
    HEALTH=$(curl -s http://127.0.0.1:7700/health 2>/dev/null || echo "failed")
    if echo "$HEALTH" | grep -q "available"; then
        echo -e "${GREEN}✓ Health check passed!${NC}"
        echo "Response: $HEALTH"
    else
        echo -e "${YELLOW}⚠ Health check: $HEALTH${NC}"
    fi
else
    echo -e "${RED}✗ Failed to start${NC}"
    echo ""
    echo "Recent logs:"
    journalctl -u meilisearch -n 30 --no-pager
    exit 1
fi

echo ""
echo "=========================================="
echo -e "${GREEN}Fix Complete!${NC}"
echo "=========================================="

