#!/usr/bin/env bash
set -euo pipefail

source /opt/date-integration/secrets.env

retry() {
  local attempts="$1"
  shift
  local delay="$1"
  shift
  local attempt
  for ((attempt = 1; attempt <= attempts; attempt++)); do
    if "$@"; then
      return 0
    fi
    sleep "$delay"
  done
  return 1
}

mysql_ready() {
  docker exec -e MYSQL_PWD="$MYSQL_ROOT_PASSWORD" date-integration-mysql \
    mysqladmin ping -h 127.0.0.1 -uroot --silent >/dev/null 2>&1
}

kafka_ready() {
  docker exec date-integration-kafka \
    /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server 127.0.0.1:9092 >/dev/null 2>&1
}

%{ if enable_pulsar ~}
pulsar_admin() {
  docker exec date-integration-pulsar bin/pulsar-admin \
    --admin-url http://127.0.0.1:8080 \
    --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationToken \
    --auth-params "token:$PULSAR_ADMIN_TOKEN" "$@"
}
%{ endif ~}

%{ if enable_schema_registry ~}
schema_registry_ready() {
  curl -fsS -u "$SCHEMA_REGISTRY_USERNAME:$SCHEMA_REGISTRY_PASSWORD" \
    "http://127.0.0.1:${schema_registry_port}/subjects" >/dev/null 2>&1
}
%{ endif ~}

pulsar_proxy_ready() {
  curl -fsS \
    -H "Authorization: Bearer $PULSAR_ADMIN_TOKEN" \
    "http://127.0.0.1:${pulsar_admin_http_port}/admin/v2/clusters" >/dev/null 2>&1
}

retry 90 5 mysql_ready
retry 90 5 kafka_ready
%{ if enable_pulsar ~}
retry 120 5 pulsar_admin brokers healthcheck
retry 120 5 pulsar_proxy_ready
%{ endif ~}
%{ if enable_schema_registry ~}
retry 120 5 schema_registry_ready
%{ endif ~}

docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" date-integration-mysql \
  mysql -h 127.0.0.1 -u'${mysql_user}' -e \
  "INSERT INTO smoke.healthcheck(payload) VALUES ('bootstrap')" >/dev/null

docker exec date-integration-kafka /opt/kafka/bin/kafka-topics.sh \
  --bootstrap-server 127.0.0.1:9092 \
  --create --if-not-exists \
  --topic date-integration-smoke \
  --partitions 3 \
  --replication-factor 1

%{ if enable_pulsar ~}
pulsar_admin namespaces grant-permission public/default \
  --role e2e-client --actions produce,consume
pulsar_admin namespaces grant-permission public/default \
  --role proxy --actions produce,consume
pulsar_admin topics create-partitioned-topic \
  persistent://public/default/date-integration-smoke \
  --partitions 1 2>/dev/null || true

pulsar_admin topics list-partitioned-topics public/default | \
  grep -q 'persistent://public/default/date-integration-smoke'

timeout 90 docker exec date-integration-pulsar-proxy bin/pulsar-client \
  --url 'pulsar://127.0.0.1:${pulsar_binary_port}' \
  --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationToken \
  --auth-params "token:$PULSAR_CLIENT_TOKEN" \
  produce persistent://public/default/date-integration-smoke \
  --messages bootstrap >/dev/null
%{ endif ~}

%{ if enable_schema_registry ~}
curl -fsS -u "$SCHEMA_REGISTRY_USERNAME:$SCHEMA_REGISTRY_PASSWORD" \
  -H 'Content-Type: application/vnd.schemaregistry.v1+json' \
  --data '{"schema":"{\"type\":\"record\",\"name\":\"Smoke\",\"fields\":[{\"name\":\"id\",\"type\":\"long\"}]}"}' \
  "http://127.0.0.1:${schema_registry_port}/subjects/date-integration-smoke-value/versions" >/dev/null
%{ endif ~}
