#!/bin/bash
set -euo pipefail

INSTANCE="prod_humboldt"
INIT_FLAG="/var/lib/koha/${INSTANCE}/.docker_initialized"

# Suprimir el warning AH00558 de Apache
echo "ServerName localhost" >> /etc/apache2/apache2.conf

# -------------------------------------------------------
# Health check temporal — responde HTTP 200 en puerto 80
# desde el primer segundo del arranque, incluso durante el
# FIRST_RUN (DB restore puede tardar 10-20 min en ECS).
# ECS ve siempre 200 → no reinicia el task por timeout.
# Se mata justo antes de que Apache tome el puerto.
# -------------------------------------------------------
python3 -c "
import http.server, socketserver
class H(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'starting')
    def log_message(self, *a): pass
socketserver.TCPServer.allow_reuse_address = True
with socketserver.TCPServer(('', 8099), H) as s:
    s.serve_forever()
" &
HEALTHCHECK_PID=$!
echo "[koha] Health check temporal iniciado (pid ${HEALTHCHECK_PID})"

# -------------------------------------------------------
# Aplica variables de entorno sobre la plantilla koha-conf.xml.
# Se llama tanto en el primer arranque como en reinicios.
# -------------------------------------------------------
apply_koha_config() {
    local tpl="/etc/koha/koha-conf.xml.tpl"
    local dst="/etc/koha/sites/${INSTANCE}/koha-conf.xml"

    # Perl en vez de sed: el password puede tener caracteres que rompen sed
    # (& en el reemplazo = "todo lo matcheado") y bash parameter expansion
    # también trata & especial. Perl hace XML-encoding y string replace limpio.
    DB_HOST="$DB_HOST" \
    DB_PORT="${DB_PORT:-3306}" \
    DB_NAME="${DB_NAME:-koha_prod_humboldt}" \
    DB_USER="${DB_USER:-koha_prod_humboldt}" \
    DB_PASSWORD="$DB_PASSWORD" \
    MEMCACHED_SERVERS="${MEMCACHED_SERVERS:-127.0.0.1:11211}" \
    KOHA_TIMEZONE="${KOHA_TIMEZONE:--05:00}" \
    perl -p -e '
        BEGIN {
            for my $k (qw(DB_HOST DB_PORT DB_NAME DB_USER DB_PASSWORD MEMCACHED_SERVERS KOHA_TIMEZONE)) {
                my $v = $ENV{$k};
                $v =~ s/&/&amp;/g;
                $v =~ s/</&lt;/g;
                $v =~ s/>/&gt;/g;
                $v =~ s/"/&quot;/g;
                $v =~ s/\x27/&apos;/g;
                $enc{$k} = $v;
            }
        }
        s|<hostname>localhost</hostname>|<hostname>$enc{DB_HOST}</hostname>|g;
        s|<port>3306</port>|<port>$enc{DB_PORT}</port>|g;
        s|<database>koha_prod_humboldt</database>|<database>$enc{DB_NAME}</database>|g;
        s|<user>koha_prod_humboldt</user>|<user>$enc{DB_USER}</user>|g;
        s|<pass>KohaProd2026!Secure</pass>|<pass>$enc{DB_PASSWORD}</pass>|g;
        s|<memcached_servers>127\.0\.0\.1:11211</memcached_servers>|<memcached_servers>$enc{MEMCACHED_SERVERS}</memcached_servers>|g;
        s|<timezone>[^<]*</timezone>|<timezone>$enc{KOHA_TIMEZONE}</timezone>|g;
    ' "$tpl" > "$dst"

    echo "[koha] koha-conf.xml aplicado (DB_HOST=$DB_HOST)"
}

# -------------------------------------------------------
# PASO 1: Crear instancia Koha (idempotente)
# Usa la existencia del usuario de sistema como indicador.
# Si el contenedor se recrea desde cero el usuario no existe;
# si sólo se reinicia, el usuario ya existe y se salta koha-create.
# -------------------------------------------------------
if ! id "${INSTANCE}-koha" &>/dev/null; then
    echo "[koha] Creando instancia Koha (fase 3.8)..."

    # koha-create falla si el directorio de logs ya existe en el volumen
    # (de una ejecución anterior parcial). Lo limpiamos antes.
    rm -rf "/var/log/koha/${INSTANCE}"

    DEBIAN_FRONTEND=noninteractive koha-create --request-db "${INSTANCE}"

    # Reemplazar koha-conf.xml auto-generado por nuestra plantilla de producción
    apply_koha_config
    cp /etc/koha/log4perl.conf.tpl "/etc/koha/sites/${INSTANCE}/log4perl.conf"

    # Actualizar ServerNames de Apache con los dominios configurados (Fase 6)
    sed -i \
        -e "s|prod_humboldt\.myDNSname\.org|${KOHA_OPAC_SERVER_NAME:-koha.local}|g" \
        -e "s|prod_humboldt-intra\.myDNSname\.org|${KOHA_INTRA_SERVER_NAME:-koha-intra.local}|g" \
        "/etc/apache2/sites-available/${INSTANCE}.conf"

    a2ensite "${INSTANCE}" 2>/dev/null || true

    # Ajustar config Apache para Docker (sin reinicios intermedios):
    # 1. Quitar AssignUserID — mpm_itk requiere CAP_SETGID que Docker no otorga
    # 2. Comentar apache-shared-disable.conf — koha-create --request-db deja la instancia deshabilitada
    # 3. Activar Plack en lugar de CGI directo
    sed -i \
        -e '/AssignUserID/d' \
        -e 's|.*Include /etc/koha/apache-shared-disable\.conf|#  Include /etc/koha/apache-shared-disable.conf|g' \
        -e 's|.*#.*Include /etc/koha/apache-shared-opac-plack\.conf|   Include /etc/koha/apache-shared-opac-plack.conf|g' \
        -e 's|.*#.*Include /etc/koha/apache-shared-intranet-plack\.conf|   Include /etc/koha/apache-shared-intranet-plack.conf|g' \
        "/etc/apache2/sites-available/${INSTANCE}.conf"

    echo "[koha] Instancia creada."
else
    # Reinicio normal: sólo actualizar koha-conf.xml con los env vars actuales
    echo "[koha] Instancia existente — actualizando configuración..."
    apply_koha_config
fi

# -------------------------------------------------------
# mpm_itk Docker fix: correr Apache como el usuario de la instancia Koha.
# mpm_itk tiene un early-exit cuando el usuario actual == usuario del VirtualHost,
# omitiendo initgroups/setuid que fallan por falta de CAP_SETGID en Docker.
# -------------------------------------------------------
sed -i \
    -e "s/^export APACHE_RUN_USER=.*/export APACHE_RUN_USER=${INSTANCE}-koha/" \
    -e "s/^export APACHE_RUN_GROUP=.*/export APACHE_RUN_GROUP=${INSTANCE}-koha/" \
    /etc/apache2/envvars
echo "[koha] Apache configurado para correr como ${INSTANCE}-koha"
grep -q "libfakegroups" /etc/apache2/envvars || echo "export LD_PRELOAD=/usr/local/lib/libfakegroups.so" >> /etc/apache2/envvars

# -------------------------------------------------------
# Compatibilidad con MySQL 8 (caching_sha2_password).
# ~/.my.cnf es leído por todos los invocadores de mysql,
# incluido koha-mysql, por lo que aplica a todo el script.
# -------------------------------------------------------
cat > /root/.my.cnf <<'EOF'
[client]
loose-get-server-public-key=1
EOF
chmod 600 /root/.my.cnf

# -------------------------------------------------------
# PASO 2: Restaurar datos (sólo si el volumen es nuevo)
# El INIT_FLAG vive en el volumen koha_data; si ese volumen
# persiste, los datos ya están en la BD y no se vuelven a importar.
# -------------------------------------------------------
FIRST_RUN=false

if [ ! -f "${INIT_FLAG}" ]; then
    FIRST_RUN=true
    echo "[koha] Primera ejecución — restaurando datos..."

    # Fase 4.1 — Restaurar base de datos (puede tardar 5-20 min)
    #
    # Compatibilidad MariaDB → MySQL 8:
    # MySQL 8 exige índice único en la tabla referenciada para crear un FK,
    # incluso con FOREIGN_KEY_CHECKS=0 (error 6125 — validación estructural).
    # El dump de Koha/MariaDB tiene FKs que referencian columnas con índice
    # compuesto (ej. illrequests_safk → authorised_values.authorised_value),
    # que MySQL 8 rechaza. Los eliminamos del stream antes del import.
    # awk: elimina líneas "CONSTRAINT ... FOREIGN KEY" y limpia la coma del ítem anterior.
    # grep: elimina ALTER TABLE ADD CONSTRAINT (FKs circulares al final del dump).
    echo "[koha] Restaurando base de datos..."
    {
        echo "SET FOREIGN_KEY_CHECKS=0;"
        echo "SET UNIQUE_CHECKS=0;"
        echo "SET sql_mode='';"
        zcat /migration/prod_humboldt-2026-04-30.sql.gz \
        | awk 'BEGIN{prev=""} /^\s*CONSTRAINT .* FOREIGN KEY/{sub(/,\s*$/,"",prev); if(prev!="") print prev; prev=""; next} {if(prev!="") print prev; prev=$0} END{if(prev!="") print prev}' \
        | grep -v "ADD CONSTRAINT.*FOREIGN KEY" \
        | grep -Eiv "^\s*(GRANT|REVOKE|CREATE USER|DROP USER|ALTER USER|SET PASSWORD)\b"
        echo "SET FOREIGN_KEY_CHECKS=1;"
        echo "SET UNIQUE_CHECKS=1;"
    } | koha-mysql "${INSTANCE}"
    echo "[koha] Base de datos restaurada."

    # Fase 4.2 — Restaurar archivos de la instancia (uploads, plugins, índices Zebra)
    echo "[koha] Restaurando archivos de la instancia..."
    tar -xzf /migration/koha_files.tar.gz \
        -C / \
        --strip-components=2 \
        --wildcards "var/lib/koha/${INSTANCE}/*"

    # Fase 8.1 — Copiar logos y hero images
    echo "[koha] Copiando assets personalizados..."
    cp /migration/assets/logo.png           /usr/share/koha/opac/htdocs/opac-tmpl/bootstrap/images/
    cp /migration/assets/logo.svg           /usr/share/koha/opac/htdocs/opac-tmpl/bootstrap/images/
    cp /migration/assets/hero-humboldt.webp /usr/share/koha/opac/htdocs/opac-tmpl/bootstrap/images/
    cp /migration/assets/hero-humboldt.jpg  /usr/share/koha/opac/htdocs/opac-tmpl/bootstrap/images/

    # Fase 8.2 — Copiar fuente personalizada
    mkdir -p /usr/share/koha/opac/htdocs/opac-tmpl/bootstrap/fonts
    cp /migration/assets/Amstelvar.ttf /usr/share/koha/opac/htdocs/opac-tmpl/bootstrap/fonts/

    # Fase 9.1 — Corregir URLs hardcodeadas en BD
    echo "[koha] Corrigiendo URLs hardcodeadas..."
    koha-mysql "${INSTANCE}" -e "
        UPDATE additional_contents_localizations
        SET content = REPLACE(content,
            'https://catalogo.humboldt.org.co/opac-tmpl/bootstrap/images/',
            '/opac-tmpl/bootstrap/images/')
        WHERE content LIKE '%catalogo.humboldt.org.co%';"

    # Fase 9.2 — Sincronizar lang=en con lang=default
    koha-mysql "${INSTANCE}" -e "
        UPDATE additional_contents_localizations acl_en
        JOIN additional_contents_localizations acl_def
            ON  acl_en.additional_content_id = acl_def.additional_content_id
            AND acl_def.lang = 'default'
        SET acl_en.content = acl_def.content
        WHERE acl_en.lang = 'en';"

    # Fase 9.3 — Habilitar bloque opacheader
    koha-mysql "${INSTANCE}" -e "
        INSERT INTO systempreferences (variable, value, explanation, type)
        VALUES ('OpacHeader', '1', 'Enable opacheader', 'YesNo')
        ON DUPLICATE KEY UPDATE value='1';"

    # Fase 4.3 — Actualizar esquema de BD al nivel de Koha 25.11
    echo "[koha] Actualizando esquema de base de datos..."
    koha-upgrade-schema "${INSTANCE}"

    # Fase 10.1 — Instalar idioma español
    echo "[koha] Instalando idioma es-ES..."
    koha-translate --install es-ES

    # Fase 10.2 — Forzar español en preferencias del sistema
    koha-mysql "${INSTANCE}" -e "
        UPDATE systempreferences SET value='es-ES' WHERE variable='OPACLanguages';
        UPDATE systempreferences SET value='es-ES' WHERE variable='StaffInterfaceLanguages';
        UPDATE systempreferences SET value='0'     WHERE variable='opaclanguagesdisplay';"

    touch "${INIT_FLAG}"
    echo "[koha] Restauración completada."
fi

# -------------------------------------------------------
# Sincronizar OPACBaseURL / staffClientBaseURL con las variables de entorno.
# Se ejecuta en cada arranque para que un cambio de dominio (ej. local → prod)
# se refleje sin entrar al panel de administración.
# Las URLs usan https:// porque el ALB siempre termina TLS; en local el nginx
# proxy también usa HTTPS, por lo que el esquema es siempre correcto.
# -------------------------------------------------------
koha-mysql "${INSTANCE}" -e "
    UPDATE systempreferences
        SET value='https://${KOHA_OPAC_SERVER_NAME}'
        WHERE variable='OPACBaseURL';
    UPDATE systempreferences
        SET value='https://${KOHA_INTRA_SERVER_NAME}'
        WHERE variable='staffClientBaseURL';" 2>/dev/null || true

# -------------------------------------------------------
# Limpiar PIDs stale de ejecuciones anteriores
# -------------------------------------------------------
rm -f /var/run/koha/"${INSTANCE}"/*.pid 2>/dev/null || true

# -------------------------------------------------------
# Fase 5 — Arranque de servicios
# -------------------------------------------------------
# Pre-crear los archivos de log con ownership correcto ANTES de cualquier
# servicio. koha-plack --start dispara "apache2 restart" que crea opac-error.log
# e intranet-error.log como root; si ya existen con ownership prod_humboldt-koha
# Apache los abre en modo append sin cambiar el owner, y Plack puede escribir.
mkdir -p "/var/log/koha/${INSTANCE}"
touch "/var/log/koha/${INSTANCE}/opac-error.log" \
      "/var/log/koha/${INSTANCE}/intranet-error.log"
chown -R "${INSTANCE}-koha:${INSTANCE}-koha" "/var/log/koha/${INSTANCE}/"
echo "[koha] Iniciando Memcached..."
service memcached start

echo "[koha] Iniciando RabbitMQ..."
service rabbitmq-server start

# Fase 5.2 — Zebra
echo "[koha] Iniciando Zebra..."
koha-zebra --start "${INSTANCE}"

# Fase 5.2 — Plack
echo "[koha] Iniciando Plack..."
koha-plack --start "${INSTANCE}"

# Fase 11 — Reindexar Zebra (sólo primera ejecución)
if [ "${FIRST_RUN}" = "true" ]; then
    echo "[koha] Reindexando Zebra (puede tardar varios minutos)..."
    koha-rebuild-zebra -f -v "${INSTANCE}"
fi

echo ""
echo "[koha] ✓ Todos los servicios iniciados."
echo "[koha]   OPAC:     http://${KOHA_OPAC_SERVER_NAME:-koha.local}"
echo "[koha]   Intranet: http://${KOHA_INTRA_SERVER_NAME:-koha-intra.local}"
echo ""

# Liberar puerto 80 antes de que Apache arranque en foreground
kill "${HEALTHCHECK_PID}" 2>/dev/null || true
wait "${HEALTHCHECK_PID}" 2>/dev/null || true

service apache2 stop 2>/dev/null || true
rm -f /var/run/apache2/apache2.pid 2>/dev/null || true

# Mantener el contenedor activo con Apache en foreground
exec apache2ctl -D FOREGROUND
