#!/usr/bin/env bash
#
# fix_static_cache.sh
#
# Ustawia cache-busting dla plików statycznych Django (STORAGES z
# ManifestStaticFilesStorage), uruchamia collectstatic, poprawia
# uprawnienia i restartuje Apache. Uruchamiaj NA SERWERZE, w katalogu
# gdzie masz manage.py (albo ustaw PROJECT_DIR poniżej).
#
# Użycie:
#   sudo bash fix_static_cache.sh
#
# Przed uruchomieniem ustaw poniższe zmienne pod swój serwer.

set -euo pipefail

# ---------------------------------------------------------------------
# KONFIGURACJA - dostosuj do swojego serwera
# ---------------------------------------------------------------------

# Katalog projektu Django (tam gdzie leży manage.py)
PROJECT_DIR="/var/www/pobierzsterownik"

# Ścieżka do virtualenv (katalog zawierający bin/activate).
# Zostaw pustą "" jeśli używasz systemowego pythona bez venv.
VENV_DIR="${PROJECT_DIR}/drivers_env"

# Ścieżka do settings.py względem PROJECT_DIR
SETTINGS_FILE="${PROJECT_DIR}/drivers/settings.py"

# Użytkownik/grupa, na których działa Apache (zwykle www-data na
# Debian/Ubuntu, apache na CentOS/RHEL)
WWW_USER="www-data"
WWW_GROUP="www-data"

# ---------------------------------------------------------------------
# Od tego miejsca nie musisz nic zmieniać
# ---------------------------------------------------------------------

echo "==> Sprawdzam katalog projektu: ${PROJECT_DIR}"
if [ ! -f "${PROJECT_DIR}/manage.py" ]; then
    echo "BŁĄD: nie znaleziono manage.py w ${PROJECT_DIR}. Popraw PROJECT_DIR w skrypcie." >&2
    exit 1
fi

if [ ! -f "${SETTINGS_FILE}" ]; then
    echo "BŁĄD: nie znaleziono ${SETTINGS_FILE}. Popraw SETTINGS_FILE w skrypcie." >&2
    exit 1
fi

echo "==> Kopia zapasowa settings.py"
cp "${SETTINGS_FILE}" "${SETTINGS_FILE}.bak_$(date +%Y%m%d_%H%M%S)"

echo "==> Sprawdzam, czy STORAGES z ManifestStaticFilesStorage już jest ustawione"
if grep -q "ManifestStaticFilesStorage" "${SETTINGS_FILE}"; then
    echo "    Już jest ustawione - pomijam patchowanie settings.py"
else
    echo "    Dodaję blok STORAGES do settings.py"
    python3 - "${SETTINGS_FILE}" <<'PYEOF'
import re
import sys

path = sys.argv[1]
with open(path, "r", encoding="utf-8") as f:
    content = f.read()

block = (
    "\n# Dodaje hash zawartosci pliku do jego nazwy przy kazdym collectstatic\n"
    "# (np. cart.a1b2c3d4.css) - dzieki temu zmiana pliku CSS/JS = nowy URL,\n"
    "# a przegladarki uzytkownikow zawsze pobiora swieza wersje.\n"
    "STORAGES = {\n"
    "    \"default\": {\n"
    "        \"BACKEND\": \"django.core.files.storage.FileSystemStorage\",\n"
    "    },\n"
    "    \"staticfiles\": {\n"
    "        \"BACKEND\": \"django.contrib.staticfiles.storage.ManifestStaticFilesStorage\",\n"
    "    },\n"
    "}\n"
)

# Wstaw blok zaraz po definicji STATICFILES_DIRS (po jej zamykajacym "]")
pattern = re.compile(r"(STATICFILES_DIRS\s*=\s*\[.*?\]\r?\n)", re.DOTALL)
match = pattern.search(content)
if not match:
    print("OSTRZEZENIE: nie znaleziono STATICFILES_DIRS - dopisuje blok na koncu pliku.")
    content = content.rstrip() + "\n" + block
else:
    insert_at = match.end()
    content = content[:insert_at] + block + content[insert_at:]

with open(path, "w", encoding="utf-8") as f:
    f.write(content)

print("    settings.py zaktualizowany.")
PYEOF
fi

echo "==> Aktywuję virtualenv (jeśli skonfigurowany) i uruchamiam collectstatic"
cd "${PROJECT_DIR}"
if [ -n "${VENV_DIR}" ] && [ -f "${VENV_DIR}/bin/activate" ]; then
    # shellcheck disable=SC1090
    source "${VENV_DIR}/bin/activate"
fi

python3 manage.py collectstatic --noinput

echo "==> Ustawiam uprawnienia do katalogu statycznego dla Apache"
STATIC_ROOT_DIR=$(python3 manage.py shell -c "from django.conf import settings; print(settings.STATIC_ROOT)")
if [ -d "${STATIC_ROOT_DIR}" ]; then
    chown -R "${WWW_USER}:${WWW_GROUP}" "${STATIC_ROOT_DIR}"
    find "${STATIC_ROOT_DIR}" -type d -exec chmod 755 {} \;
    find "${STATIC_ROOT_DIR}" -type f -exec chmod 644 {} \;
    echo "    Uprawnienia ustawione dla: ${STATIC_ROOT_DIR}"
else
    echo "    OSTRZEZENIE: nie znaleziono katalogu STATIC_ROOT (${STATIC_ROOT_DIR})"
fi

echo "==> Restartuję Apache"
if systemctl restart apache2 2>/dev/null; then
    echo "    apache2 zrestartowany (systemctl)"
elif systemctl restart httpd 2>/dev/null; then
    echo "    httpd zrestartowany (systemctl)"
elif service apache2 restart 2>/dev/null; then
    echo "    apache2 zrestartowany (service)"
elif service httpd restart 2>/dev/null; then
    echo "    httpd zrestartowany (service)"
else
    echo "    OSTRZEZENIE: nie udało się automatycznie zrestartować Apache - zrestartuj ręcznie (sudo systemctl restart apache2)"
fi

echo ""
echo "==> Gotowe. Sprawdź w przeglądarce (Ctrl+U na /cart/), czy link do CSS"
echo "    ma teraz w nazwie hash, np. main/cart.XXXXXXXX.css"
