#!/bin/bash
set -euo pipefail

ROOT="${PRUVA_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
LOGS="$ROOT/logs"
mkdir -p "$LOGS"

cd "$ROOT"

# Define paths
REPRO_DIR="$ROOT/repro"
DATAEASE_DIR="$ROOT/external/dataease"
TEST_BASE="/tmp/dataease-repro"

# Clean up previous test
rm -rf "$TEST_BASE"
mkdir -p "$TEST_BASE/conf" "$TEST_BASE/bin/mysql" "$TEST_BASE/data/mysql" "$TEST_BASE/logs" "$TEST_BASE/cache" "$TEST_BASE/data/static-resource" "$TEST_BASE/data/geo" "$TEST_BASE/data/appearance" "$TEST_BASE/data/exportData" "$TEST_BASE/data/plugin" "$TEST_BASE/data/font" "$TEST_BASE/data/i18n"

# Create mysql init script
cat > "$TEST_BASE/bin/mysql/init.sql" <<'EOF'
CREATE DATABASE IF NOT EXISTS `dataease` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
EOF

# Create my.cnf
cat > "$TEST_BASE/conf/my.cnf" <<'EOF'
[mysqld]
default-storage-engine=INNODB
character_set_server=utf8mb4
table_open_cache=128
max_connections=2000
max_connect_errors=6000
innodb_file_per_table=1
max_allowed_packet=64M
transaction_isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
innodb_lock_wait_timeout=1800
innodb_flush_log_at_trx_commit=0
sync_binlog=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
skip-name-resolve
EOF

# Create mysql.env
cat > "$TEST_BASE/conf/mysql.env" <<'EOF'
MYSQL_ROOT_PASSWORD=Password123@mysql
EOF

# Create application.yml for DataEase
cat > "$TEST_BASE/conf/application.yml" <<'EOF'
server:
  tomcat:
    connection-timeout: 70000
  servlet:
    context-path: 
spring:
  servlet:
    multipart:
      max-file-size: 500MB
      max-request-size: 500MB
  datasource:
    url: jdbc:mysql://mysql-de:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: Password123@mysql
dataease:
  apisix-api:
    domain: http://apisix:9180
    key: DE_APISIX_KEY
  export:
    views:
      limit: 100000
    dataset:
      limit: 100000
  origin-list: "http://localhost:8100"
  login_timeout: 960
  dataease-servers: dataease
  playwright-server: http://de-playwright-api:3000/screenshot
task:
  executor:
    address: http://sync-task-actuator:9001
    log:
      path: /opt/dataease2.0/logs/sync-task/task-handler-log
EOF

# Create docker compose
cat > "$TEST_BASE/docker compose.yml" <<EOF
version: '3.8'
services:
  mysql-de:
    image: registry.cn-qingdao.aliyuncs.com/dataease/mysql:8.4.5
    container_name: mysql-de
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-pPassword123@mysql", "--protocol", "tcp"]
      interval: 5s
      timeout: 3s
      retries: 15
    environment:
      MYSQL_ROOT_PASSWORD: Password123@mysql
    volumes:
      - $TEST_BASE/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - $TEST_BASE/bin/mysql:/docker-entrypoint-initdb.d/
      - $TEST_BASE/data/mysql:/var/lib/mysql
    networks:
      - de-net
    ports:
      - "3306:3306"

  dataease:
    image: registry.cn-qingdao.aliyuncs.com/dataease/dataease:v2.10.20
    container_name: dataease-vuln
    ports:
      - "8100:8100"
    volumes:
      - $TEST_BASE/conf:/opt/apps/config
      - $TEST_BASE/logs:/opt/dataease2.0/logs
      - $TEST_BASE/data/static-resource:/opt/dataease2.0/data/static-resource
      - $TEST_BASE/cache:/opt/dataease2.0/cache
      - $TEST_BASE/data/geo:/opt/dataease2.0/data/geo
      - $TEST_BASE/data/appearance:/opt/dataease2.0/data/appearance
      - $TEST_BASE/data/exportData:/opt/dataease2.0/data/exportData
      - $TEST_BASE/data/plugin:/opt/dataease2.0/data/plugin
      - $TEST_BASE/data/font:/opt/dataease2.0/data/font
      - $TEST_BASE/data/i18n:/opt/dataease2.0/data/i18n
    depends_on:
      mysql-de:
        condition: service_healthy
    networks:
      - de-net
    environment:
      - SPRING_PROFILES_ACTIVE=standalone

networks:
  de-net:
    name: de-net
EOF

# Clean up any existing containers
docker rm -f mysql-de dataease-vuln 2>/dev/null || true

echo "[*] Starting DataEase v2.10.20 + MySQL..."
cd "$TEST_BASE"
docker compose up -d

# Wait for MySQL to be healthy
echo "[*] Waiting for MySQL to be healthy..."
for i in $(seq 1 60); do
    if docker inspect --format='{{.State.Health.Status}}' mysql-de 2>/dev/null | grep -q "healthy"; then
        echo "[*] MySQL is healthy"
        break
    fi
    sleep 2
    if [ "$i" -eq 60 ]; then
        echo "[*] MySQL failed to become healthy"
        docker compose logs mysql-de > "$LOGS/mysql.log" 2>&1
        exit 1
    fi
done

# Wait for DataEase to start responding
echo "[*] Waiting for DataEase to start..."
for i in $(seq 1 120); do
    if curl -sf http://localhost:8100/api/datasource/types 2>/dev/null | grep -q "mysql"; then
        echo "[*] DataEase is up!"
        break
    fi
    sleep 3
    if [ "$i" -eq 120 ]; then
        echo "[*] DataEase failed to start"
        docker compose logs dataease > "$LOGS/dataease-startup.log" 2>&1
        exit 1
    fi
done

echo "[*] DataEase v2.10.20 is running on http://localhost:8100"
