#!/bin/bash

if [ -n "$SUDO_USER" ]; then
  source /home/$SUDO_USER/.index.sh
else
  source $HOME/.index.sh
fi

YAML_FILE="/srv/containers.yaml"

function tools {
  if ! var0=$(dialog --title "" --backtitle "" --menu " " 0 0 0 \
  1 'MACVLAN Settings' \
  3 'PiHole Settings' \
  5 'Syncthing Reset Password' \
  6 'Nextcloud Settings' \
  7 'Compare Docker PS and YAML' \
  8 'Remove All Useless Images' \
  9 'CAUTION: Remove All Inconsistencies' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi
  case "$var0" in
  1) clear ; macvlan0 ; tools ;;
  3) clear ; pihole0 ; tools ;;
  5) clear ; syncpass0 ; tools ;;
  6) clear ; nextcloud0 ; tools ;;
  7) clear ; comparedocker ; tools ;;
  8) clear ; docker image prune -af ; sleep 1 ; tools ;;
  9) clear ; remove_inconsistencies ; tools ;;
  X) return ;;
  esac
}

function macvlan0 {
  if ! var0=$(dialog --title "MACVLAN" --backtitle "MACVLAN" --menu " " 0 0 0 \
  1 'Set' \
  2 'Remove' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi
  case "$var0" in
  1) clear ; curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 $link103 | sudo bash ; tools ;;
  2) clear ; curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2 $link102 | sudo bash ; tools ;;
  X) return ;;
  esac
}

function pihole0 {
  if ! var0=$(dialog --title "PiHole" --backtitle "PiHole" --menu " " 0 0 0 \
  1 'Maintenance' \
  2 'Install Error' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi
  case "$var0" in
  1) clear ; piholemnt ; tools ;;
  2) clear ; piholeinst ; tools ;;
  X) return ;;
  esac
}

function nextcloud0 {
  if ! var0=$(dialog --title "Nextcloud" --backtitle "Nextcloud" --menu " " 0 0 0 \
  1 'remove filelocks' \
  2 'add-missing-indices' \
  3 'check-core & mimetype' \
  4 'Disable LDAP (emergency)' \
  5 'Upgrade Manually CLI' \
  6 'reScan App Data' \
  7 'reScan User Data' \
  8 'Update .htaccess' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi
  case "$var0" in
  1) clear ; filelocks ; tools ;;
  2) clear ; missingindices ; tools ;;
  3) clear ; checkcore ; tools ;;
  4) clear ; disableldap ; tools ;;
  5) clear ; upgradenc ; tools ;;
  6) clear ; scanapp0 ; tools ;;
  7) clear ; scanuser0 ; tools ;;
  8) clear ; updateht0 ; tools ;;
  X) return ;;
  esac
}

function comparedocker {
# Verifica se o arquivo YAML existe
if [[ ! -f "$YAML_FILE" ]]; then
    echo "❌ Arquivo $YAML_FILE não encontrado!"
    exit 1
fi

# Verifica se yq está instalado
if ! command -v yq &> /dev/null; then
    echo "❌ yq não está instalado!"
    exit 1
fi

echo "🔍 Comparando containers do Docker with $YAML_FILE..."
echo "=================================================="

# Obter lista de containers do Docker (apenas nomes)
echo "📦 Containers no Docker:"
docker_containers=$(docker ps -a --format "{{.Names}}" | sort)
echo "$docker_containers"
echo

# Obter lista de nome_custom do YAML
echo "📄 Containers no YAML (nome_custom):"
yaml_containers=$(yq eval 'keys | .[]' "$YAML_FILE" 2>/dev/null | while read -r key; do
    yq eval ".\"$key\".nome_custom" "$YAML_FILE" 2>/dev/null
done | sort | grep -v "null")
echo "$yaml_containers"
echo

# Containers que estão no Docker mas NÃO estão no YAML
echo "⚠️  Containers no Docker que NÃO estão no YAML:"
comm -23 <(echo "$docker_containers") <(echo "$yaml_containers") | while read -r container; do
    if [[ -n "$container" ]]; then
        echo "  - $container"
    fi
done
echo

# Containers que estão no YAML mas NÃO estão no Docker
echo "📋 Containers no YAML que NÃO estão no Docker:"
comm -13 <(echo "$docker_containers") <(echo "$yaml_containers") | while read -r container; do
    if [[ -n "$container" ]]; then
        echo "  - $container"
    fi
done
echo

# Containers que coincidem
echo "✅ Containers que coincidem:"
comm -12 <(echo "$docker_containers") <(echo "$yaml_containers") | while read -r container; do
    if [[ -n "$container" ]]; then
        echo "  - $container"
    fi
done
echo

# Resumo
docker_count=$(echo "$docker_containers" | grep -c '^.')
yaml_count=$(echo "$yaml_containers" | grep -c '^.')
matching_count=$(comm -12 <(echo "$docker_containers") <(echo "$yaml_containers") | grep -c '^.')

echo "📊 RESUMO:"
echo "  Containers no Docker: $docker_count"
echo "  Containers no YAML: $yaml_count"
echo "  Correspondências: $matching_count"

if [[ $matching_count -eq $docker_count ]] && [[ $matching_count -eq $yaml_count ]]; then
    echo "  Status: ✅ Todos os containers coincidem!"
else
    echo "  Status: ⚠️  Há diferenças entre as listas"
fi

echo ""
read -p "Pressione ENTER para continuar!"
}

function remove_inconsistencies {
  echo "wip"
}

function updateht0 {
  clear
  docker exec -u www-data nextcloud php /var/www/html/occ maintenance:update:htaccess
  sleep 5
}

function scanapp0 {
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome (para container nextcloud, não MySQL)
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container NextCloud (não MySQL) lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud que NÃO é MySQL, adiciona à lista
        if [[ "$img_base" != "mysql" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud (aplicação) encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      echo "$((i+1)). ${NEXTCLOUD_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Nextcloud" 9 35 0 \
  "NextCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear; echo "Scanning app data..."
  docker exec -u 33 "$var1" ./occ files:scan-app-data
  sleep 3
}

function scanuser0 {  
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome (para container nextcloud, não MySQL)
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container NextCloud (não MySQL) lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud que NÃO é MySQL, adiciona à lista
        if [[ "$img_base" != "mysql" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud (aplicação) encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      echo "$((i+1)). ${NEXTCLOUD_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Nextcloud" 9 35 0 \
  "NextCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear; echo "Scanning all user files..."
  docker exec -u 33 "$var1" ./occ files:scan --all
  sleep 3
}

function syncpass0 { 
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "syncthing" no nome
  SYNCTHING_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "syncthing"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ syncthing ]]; then
        # Verifica se é um container Syncthing lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container syncthing, adiciona à lista
        if [[ -n "$nome_custom" ]]; then
          SYNCTHING_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#SYNCTHING_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container Syncthing encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#SYNCTHING_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${SYNCTHING_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers Syncthing encontrados:"
    for i in "${!SYNCTHING_CONTAINERS[@]}"; do
      echo "$((i+1)). ${SYNCTHING_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#SYNCTHING_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#SYNCTHING_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${SYNCTHING_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Syncthing" 8 35 0 \
  "NomeCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear
  docker exec -it "$var1" syncthing generate --gui-password=admin --gui-user=admin
  echo ""; echo "Usuario e senha da WebGUI foram modificados para admin/admin!"
}

function upgradenc { 
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome (para container nextcloud, não MySQL)
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container NextCloud (não MySQL) lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud que NÃO é MySQL, adiciona à lista
        if [[ "$img_base" != "mysql" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud (aplicação) encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      echo "$((i+1)). ${NEXTCLOUD_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Nextcloud" 9 35 0 \
  "NextCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear
  echo "Upgrading..."
  docker exec -u 33 "$var1" ./occ upgrade
  docker exec -u 33 "$var1" apt update
  docker exec -u 33 "$var1" apt install smbclient libsmbclient-dev -y
  sleep 3
}

function disableldap { 
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome (para container nextcloud, não MySQL)
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container NextCloud (não MySQL) lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud que NÃO é MySQL, adiciona à lista
        if [[ "$img_base" != "mysql" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud (aplicação) encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      echo "$((i+1)). ${NEXTCLOUD_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Disable LDAP" 9 35 0 \
  "NextCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear
  echo "Disabling LDAP Backend!"
  docker exec -u 33 "$var1" ./occ ldap:set-config "s01" "ldapConfigurationActive" "0"
  sleep 2
  docker restart "$var1"
  sleep 3
}

function checkcore { 
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome (para container nextcloud, não MySQL)
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container NextCloud (não MySQL) lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud que NÃO é MySQL, adiciona à lista
        if [[ "$img_base" != "mysql" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud (aplicação) encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      echo "$((i+1)). ${NEXTCLOUD_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Nextcloud" 9 35 0 \
  "NextCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear; echo "Checking core integrity..."
  docker exec -u 33 "$var1" ./occ integrity:check-core
  docker exec -u 33 "$var1" ./occ maintenance:mimetype:update-js
  docker exec -u 33 "$var1" ./occ integrity:check-core
  docker exec -u 33 "$var1" ./occ maintenance:mimetype:update-js
  sleep 3
}

function missingindices {  
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome (para container nextcloud, não MySQL)
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container NextCloud (não MySQL) lendo as próximas linhas
        img_base=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud que NÃO é MySQL, adiciona à lista
        if [[ "$img_base" != "mysql" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud (aplicação) encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      echo "$((i+1)). ${NEXTCLOUD_CONTAINERS[$i]}"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      SELECTED_CONTAINER="${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche o valor encontrado
  VALUE1="$SELECTED_CONTAINER"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "Nextcloud" 9 35 0 \
  "NextCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai o valor do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  
  clear
  echo "Adding missing indices..."
  docker exec -u 33 "$var1" ./occ db:add-missing-indices
  echo "ok"; sleep 3
  clear
  echo "Fixing mimetypes..."
  docker exec -u 33 "$var1" ./occ maintenance:repair --include-expensive
  echo "ok"; sleep 3
  sleep 3
}

function piholemnt {
  VALUE1="pihole"

  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "PiHole" 8 35 0 \
  "NomeCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi

  clear
  var1=$(echo "$VALUE0" | sed -n 1p)
  docker exec "$var1" bash -c "pihole -g -r recover"
  docker exec "$var1" bash -c "rm /etc/pihole/pihole-FTL.db"
  docker restart "$var1"
}

function piholeinst {
  VALUE1="pihole"

  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "PiHole" 8 35 0 \
  "NomeCont:" 1 1 "$VALUE1" 1 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi

  clear
  var1=$(echo "$VALUE0" | sed -n 1p)
  docker exec "$var1" bash -c "rm /etc/pihole/gravity.db"
  docker exec "$var1" bash -c "pihole -g"
  docker restart "$var1"
}

function filelocks {  
  # Verifica se o arquivo YAML existe
  if [[ ! -f "$YAML_FILE" ]]; then
    echo "Erro: Arquivo YAML não encontrado: $YAML_FILE"
    return 1
  fi
  
  # Busca por entradas que contenham "nextcloud" no nome e tenham img_base: mysql
  NEXTCLOUD_CONTAINERS=()
  
  while IFS= read -r line; do
    # Procura por linhas que terminam com ":" e contêm "nextcloud"
    if [[ "$line" =~ ^[[:space:]]*([^:]+):[[:space:]]*$ ]]; then
      container_name="${BASH_REMATCH[1]}"
      if [[ "$container_name" =~ nextcloud ]]; then
        # Verifica se é um container MySQL lendo as próximas linhas
        img_base=""
        mysql_pw=""
        nome_custom=""
        
        # Lê as próximas linhas para encontrar img_base, mysql_pw e nome_custom
        while IFS= read -r next_line; do
          # Para quando encontrar outro container (nova linha terminando com :)
          if [[ "$next_line" =~ ^[[:space:]]*[^:]+:[[:space:]]*$ ]] && [[ ! "$next_line" =~ ^[[:space:]]*[[:space:]] ]]; then
            break
          fi
          
          if [[ "$next_line" =~ ^[[:space:]]*img_base:[[:space:]]*(.+)$ ]]; then
            img_base="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*mysql_pw:[[:space:]]*(.+)$ ]]; then
            mysql_pw="${BASH_REMATCH[1]}"
          elif [[ "$next_line" =~ ^[[:space:]]*nome_custom:[[:space:]]*(.+)$ ]]; then
            nome_custom="${BASH_REMATCH[1]}"
          fi
        done < <(tail -n +$(($(grep -n "^[[:space:]]*${container_name}:" "$YAML_FILE" | cut -d: -f1) + 1)) "$YAML_FILE")
        
        # Se encontrou um container nextcloud com img_base mysql, adiciona à lista
        if [[ "$img_base" == "mysql" ]] && [[ -n "$mysql_pw" ]] && [[ -n "$nome_custom" ]]; then
          NEXTCLOUD_CONTAINERS+=("$nome_custom|$mysql_pw")
        fi
      fi
    fi
  done < "$YAML_FILE"
  
  # Verifica se encontrou algum container
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 0 ]]; then
    echo "Nenhum container NextCloud com MySQL encontrado no arquivo YAML."
    return 1
  fi
  
  # Se encontrou apenas um, usa diretamente
  if [[ ${#NEXTCLOUD_CONTAINERS[@]} -eq 1 ]]; then
    IFS='|' read -r SELECTED_CONTAINER SELECTED_PASSWORD <<< "${NEXTCLOUD_CONTAINERS[0]}"
  else
    # Se encontrou múltiplos, permite seleção
    echo "Múltiplos containers NextCloud encontrados:"
    for i in "${!NEXTCLOUD_CONTAINERS[@]}"; do
      IFS='|' read -r container_name password <<< "${NEXTCLOUD_CONTAINERS[$i]}"
      echo "$((i+1)). $container_name"
    done
    
    read -p "Selecione o container (1-${#NEXTCLOUD_CONTAINERS[@]}): " selection
    
    if [[ "$selection" =~ ^[0-9]+$ ]] && [[ "$selection" -ge 1 ]] && [[ "$selection" -le ${#NEXTCLOUD_CONTAINERS[@]} ]]; then
      IFS='|' read -r SELECTED_CONTAINER SELECTED_PASSWORD <<< "${NEXTCLOUD_CONTAINERS[$((selection-1))]}"
    else
      echo "Seleção inválida."
      return 1
    fi
  fi
  
  # Pré-preenche os valores encontrados
  VALUE1="$SELECTED_CONTAINER"
  VALUE2="$SELECTED_PASSWORD"
  
  # Mostra dialog para confirmação/edição
  if ! VALUE0=$(dialog --ok-label "Ok" --title "Manutencao" --form "MySQL - NextCloud" 9 35 0 \
  "mSQLcont:" 1 1 "$VALUE1" 1 11 30 0 \
  "Password:" 2 1 "$VALUE2" 2 11 30 0 \
  3>&1 1>&2 2>&3 3>&- > /dev/tty); then
    return
  fi
  
  # Extrai os valores do dialog
  var1=$(echo "$VALUE0" | sed -n 1p)
  var2=$(echo "$VALUE0" | sed -n 2p)
  
  clear
  echo "File Locks atualmente no Banco de Dados:"
  docker exec "$var1" mysql --user=root -D nextcloud -e 'SELECT * FROM oc_file_locks;'
  sleep 5
  docker exec "$var1" mysql --user=root --password="$var2" -D nextcloud -e 'delete from oc_file_locks where 1'
  sleep 1
  clear
  echo "Conferencia de limpeza de File Locks:"
  docker exec "$var1" mysql --user=root -D nextcloud -e 'SELECT * FROM oc_file_locks;'
  echo "Se nada aparecer aqui, foi limpo com sucesso!"
  sleep 3
}

tools

exit 0
