#!/bin/bash

# ==============================================================================
# Configuration
# ==============================================================================
STORE_PASSWORD="password"
KEY_PASSWORD="password"
DNAME="OU=CamelSoft, O=CamelSoft, L=Sousse, S=Sousse, C=TN"

# Define a temporary central directory for the Eureka server's public certificate
TEMP_CERT_DIR="temp_certs"
EUREKA_CERT_PATH="$TEMP_CERT_DIR/eureka_server.crt"

# Array of all your microservices
SERVICES=(
    "admin-service"
    "api-gateway"
    "auth-service"
    "client-service"
    "common"
    "config-server"
    "corporate-service"
    "driver-service"
    "eureka-server"
    "invoices"
    "location-service"
    "notification-service"
    "pricing-service"
    "report-service"
    "ride-service"
)

# ==============================================================================
# STEP 1: Clean up all old certificates and keystores
# ==============================================================================
echo "--- Deleting all old certificate files and directories ---"
rm -rf "$TEMP_CERT_DIR"
rm -rf "keystores"
rm -rf "certs"
mkdir "$TEMP_CERT_DIR"

for SERVICE in "${SERVICES[@]}"; do
    echo "Cleaning old certs from $SERVICE..."
    rm -rf "$SERVICE/src/main/resources/certs"
done
echo "Cleanup complete."
echo ""

# ==============================================================================
# STEP 2: Generate Keystore and Public Certificate for Eureka Server
# ==============================================================================
echo "--- Generating PKCS12 keys for eureka-server ---"
EUREKA_CERTS_DIR="eureka-server/src/main/resources/certs"
mkdir -p "$EUREKA_CERTS_DIR"

# FIX 1: Changed CN from 'localhost' to 'eureka-server' to match the docker-compose service name.
# FIX 2: Changed alias to 'eureka' to match the docker-compose environment variable.
keytool -genkeypair -alias eureka-server -keyalg RSA -keysize 2048 \
  -storetype PKCS12 \
  -keystore "$EUREKA_CERTS_DIR/keystore.p12" \
  -dname "CN=eureka-server, $DNAME" \
  -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD"

# Export the public certificate using the correct keystore alias
keytool -exportcert -alias eureka-server -keystore "$EUREKA_CERTS_DIR/keystore.p12" -rfc \
  -file "$EUREKA_CERT_PATH" -storepass "$STORE_PASSWORD"

echo "Eureka Server keystore created in: $EUREKA_CERTS_DIR"
echo "-------------------------------------------"
echo ""

# ==============================================================================
# STEP 3: Generate Keystore and Truststore for each Microservice
# ==============================================================================
for SERVICE in "${SERVICES[@]}"; do
    if [ "$SERVICE" == "eureka-server" ]; then
        continue
    fi

    echo "--- Generating PKCS12 keys for $SERVICE ---"
    CERTS_DIR="$SERVICE/src/main/resources/certs"
    mkdir -p "$CERTS_DIR"

    # Generate the service's own keystore
    keytool -genkeypair -alias "$SERVICE" -keyalg RSA -keysize 2048 \
      -storetype PKCS12 \
      -keystore "$CERTS_DIR/keystore.p12" \
      -dname "CN=$SERVICE, $DNAME" \
      -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD"

    # Create a truststore for the service that trusts the Eureka server
    keytool -importcert -alias eureka -file "$EUREKA_CERT_PATH" \
      -storetype PKCS12 \
      -keystore "$CERTS_DIR/truststore.p12" \
      -storepass "$STORE_PASSWORD" -noprompt

    echo "Keystore and Truststore created in: $CERTS_DIR"
    echo "-------------------------------------------"
    echo ""
done

# ==============================================================================
# STEP 4: Final Cleanup
# ==============================================================================
echo "--- Removing temporary certificate directory ---"
rm -rf "$TEMP_CERT_DIR"
echo ""

echo "All keys and certificates have been generated successfully."
