#!/bin/bash

# MYP Backend Installations-Skript
# Dieses Skript installiert das Backend mit Docker und Host-Netzwerkanbindung

# Farbcodes für Ausgabe
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Funktion zur Ausgabe mit Zeitstempel
log() {
  echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

error_log() {
  echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2
}

# Pfade definieren
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BACKEND_DIR="$SCRIPT_DIR/backend"

# Prüfen ob Verzeichnis existiert
if [ ! -d "$BACKEND_DIR" ]; then
  error_log "Backend-Verzeichnis '$BACKEND_DIR' nicht gefunden."
  exit 1
fi

# Prüfen ob Docker installiert ist
if ! command -v docker &> /dev/null; then
  error_log "Docker ist nicht installiert. Bitte installieren Sie Docker."
  log "Siehe: https://docs.docker.com/get-docker/"
  exit 1
fi

if ! command -v docker compose &> /dev/null; then
  error_log "Docker Compose ist nicht installiert. Bitte installieren Sie Docker Compose."
  log "Siehe: https://docs.docker.com/compose/install/"
  exit 1
fi

# Prüfen ob wget installiert ist (wird für healthcheck verwendet)
if ! command -v wget &> /dev/null; then
  error_log "wget ist nicht installiert, wird aber für den Container-Healthcheck benötigt."
  log "Installation mit: sudo apt-get install wget"
  exit 1
fi

# Wechsle ins Backend-Verzeichnis
log "Wechsle ins Verzeichnis: $BACKEND_DIR"
cd "$BACKEND_DIR" || {
  error_log "Konnte nicht ins Verzeichnis $BACKEND_DIR wechseln."
  exit 1
}

# Prüfe ob Dockerfile existiert
if [ ! -f "Dockerfile" ]; then
  error_log "Dockerfile nicht gefunden in $BACKEND_DIR."
  exit 1
fi

# Prüfe ob docker-compose.yml existiert
if [ ! -f "docker-compose.yml" ]; then
  error_log "docker-compose.yml nicht gefunden in $BACKEND_DIR."
  exit 1
fi

# Erstelle .env-Datei
log "${YELLOW}Erstelle .env Datei...${NC}"
cat > .env << EOL
SECRET_KEY=7445630171969DFAC92C53CEC92E67A9CB2E00B3CB2F
DATABASE_PATH=instance/myp.db
TAPO_USERNAME=till.tomczak@mercedes-benz.com
TAPO_PASSWORD=744563017196A
PRINTERS={"Printer 1": {"ip": "192.168.0.100"}, "Printer 2": {"ip": "192.168.0.101"}, "Printer 3": {"ip": "192.168.0.102"}, "Printer 4": {"ip": "192.168.0.103"}, "Printer 5": {"ip": "192.168.0.104"}, "Printer 6": {"ip": "192.168.0.106"}}
EOL

if [ ! -f ".env" ]; then
  error_log "Konnte .env-Datei nicht erstellen. Prüfen Sie die Berechtigungen."
  exit 1
fi
log "${GREEN}.env Datei erfolgreich erstellt${NC}"

# Verzeichnisse erstellen
log "Erstelle benötigte Verzeichnisse"
if ! mkdir -p logs; then
  error_log "Konnte Verzeichnis 'logs' nicht erstellen. Prüfen Sie die Berechtigungen."
  exit 1
fi

if ! mkdir -p instance; then
  error_log "Konnte Verzeichnis 'instance' nicht erstellen. Prüfen Sie die Berechtigungen."
  exit 1
fi

# Docker-Image bauen und starten
log "${YELLOW}Baue und starte Backend-Container...${NC}"
if ! docker compose up -d --build; then
  error_log "Docker Compose fehlgeschlagen. Siehe Fehlermeldung oben."
  exit 1
fi

# Prüfe, ob der Container läuft
log "Warte 10 Sekunden, bis der Container gestartet ist..."
sleep 10
if docker ps | grep -q "myp-backend"; then
  log "${GREEN}Backend-Container läuft${NC}"
else
  error_log "Backend-Container läuft nicht. Container-Status:"
  docker ps -a | grep myp-backend
  log "Container-Logs:"
  docker logs myp-backend
  exit 1
fi

# Test API-Endpunkt
log "${YELLOW}Teste Backend-API...${NC}"
if curl -s http://localhost:5000/health | grep -q "healthy"; then
  log "${GREEN}Backend-API ist erreichbar und funktioniert${NC}"
else
  error_log "Backend-API ist nicht erreichbar. HTTP-Status:"
  curl -s -o /dev/null -w "%{http_code}" http://localhost:5000/health
  log "Container-Logs:"
  docker logs myp-backend
fi

# Initialisierung der Datenbank prüfen
log "${YELLOW}Prüfe Datenbank-Initialisierung...${NC}"
if [ ! -s "instance/myp.db" ]; then
  log "${YELLOW}Datenbank scheint leer zu sein. Führe Initialisierungsskript aus...${NC}"
  DB_INIT_OUTPUT=$(docker exec myp-backend python -c "from app import init_db; init_db()" 2>&1)
  if [ $? -eq 0 ]; then
    log "${GREEN}Datenbank erfolgreich initialisiert${NC}"
  else
    error_log "Fehler bei der Datenbank-Initialisierung:"
    echo "$DB_INIT_OUTPUT"
    log "Container-Logs:"
    docker logs myp-backend
  fi
else
  log "${GREEN}Datenbank existiert bereits${NC}"
fi

# Teste, ob ein API-Endpunkt Daten zurückgibt
log "${YELLOW}Teste Datenbank-Verbindung über API...${NC}"
if curl -s http://localhost:5000/api/printers | grep -q "\[\]"; then
  log "${GREEN}Datenbank-Verbindung funktioniert${NC}"
else
  log "${YELLOW}API gibt keine leere Drucker-Liste zurück. Möglicherweise ist die DB nicht korrekt initialisiert.${NC}"
  log "API-Antwort:"
  curl -s http://localhost:5000/api/printers
fi

log "${GREEN}=== Installation abgeschlossen ===${NC}"
log "Das Backend ist unter http://localhost:5000 erreichbar"
log "Anzeigen der Logs: docker logs -f myp-backend"
log "Backend stoppen: docker compose -f $BACKEND_DIR/docker-compose.yml down"