#!/bin/bash
# =============================================================================
# Script para criar/recriar Docker Secrets no Swarm
# QR Rapido - Produção
# =============================================================================
#
# USO:
#   ./create-docker-secrets.sh              # Modo interativo (pede cada valor)
#   ./create-docker-secrets.sh --from-env   # Lê de variáveis de ambiente
#   ./create-docker-secrets.sh --from-file secrets.env  # Lê de arquivo .env
#   ./create-docker-secrets.sh --delete     # Remove todos os secrets
#   ./create-docker-secrets.sh --list       # Lista secrets existentes
#
# IMPORTANTE: Execute este script no servidor MANAGER do Docker Swarm
# =============================================================================

set -e

# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Lista de secrets necessários
SECRETS=(
    "stripe_secret_key"
    "stripe_webhook_secret"
    "mongodb_connection_string"
    "google_client_id"
    "google_client_secret"
    "microsoft_client_id"
    "microsoft_client_secret"
)

# Descrições dos secrets
declare -A SECRET_DESCRIPTIONS=(
    ["stripe_secret_key"]="Stripe API Secret Key (sk_live_xxx)"
    ["stripe_webhook_secret"]="Stripe Webhook Signing Secret (whsec_xxx)"
    ["mongodb_connection_string"]="MongoDB Connection String completa"
    ["google_client_id"]="Google OAuth Client ID"
    ["google_client_secret"]="Google OAuth Client Secret"
    ["microsoft_client_id"]="Microsoft OAuth Client ID (GUID)"
    ["microsoft_client_secret"]="Microsoft OAuth Client Secret"
)

# Função para exibir uso
show_usage() {
    echo -e "${BLUE}=== QR Rapido - Docker Secrets Manager ===${NC}"
    echo ""
    echo "Uso: $0 [opção]"
    echo ""
    echo "Opções:"
    echo "  (sem opção)     Modo interativo - pede cada valor"
    echo "  --from-env      Lê valores de variáveis de ambiente"
    echo "  --from-file F   Lê valores de arquivo .env"
    echo "  --delete        Remove todos os secrets"
    echo "  --list          Lista secrets existentes"
    echo "  --check         Verifica quais secrets estão faltando"
    echo "  --help          Exibe esta ajuda"
    echo ""
    echo "Variáveis de ambiente esperadas (para --from-env):"
    for secret in "${SECRETS[@]}"; do
        local env_var=$(echo "$secret" | tr '[:lower:]' '[:upper:]')
        echo "  $env_var"
    done
}

# Função para verificar se está no Swarm
check_swarm() {
    if ! docker info 2>/dev/null | grep -q "Swarm: active"; then
        echo -e "${RED}ERRO: Docker Swarm não está ativo neste nó.${NC}"
        echo "Execute este script no servidor manager do Swarm."
        exit 1
    fi

    if ! docker info 2>/dev/null | grep -q "Is Manager: true"; then
        echo -e "${RED}ERRO: Este nó não é um manager do Swarm.${NC}"
        echo "Execute este script no servidor manager do Swarm."
        exit 1
    fi
}

# Função para listar secrets
list_secrets() {
    echo -e "${BLUE}=== Secrets existentes ===${NC}"
    docker secret ls
    echo ""
    echo -e "${BLUE}=== Status dos secrets do QR Rapido ===${NC}"
    for secret in "${SECRETS[@]}"; do
        if docker secret inspect "$secret" > /dev/null 2>&1; then
            echo -e "  ${GREEN}✓${NC} $secret"
        else
            echo -e "  ${RED}✗${NC} $secret (não existe)"
        fi
    done
}

# Função para verificar secrets faltantes
check_secrets() {
    echo -e "${BLUE}=== Verificando secrets do QR Rapido ===${NC}"
    local missing=0
    for secret in "${SECRETS[@]}"; do
        if docker secret inspect "$secret" > /dev/null 2>&1; then
            echo -e "  ${GREEN}✓${NC} $secret"
        else
            echo -e "  ${RED}✗${NC} $secret - ${SECRET_DESCRIPTIONS[$secret]}"
            missing=$((missing + 1))
        fi
    done

    if [ $missing -gt 0 ]; then
        echo ""
        echo -e "${YELLOW}$missing secret(s) faltando.${NC}"
        echo "Execute: $0 (modo interativo) para criar os secrets faltantes."
        return 1
    else
        echo ""
        echo -e "${GREEN}Todos os secrets estão configurados!${NC}"
        return 0
    fi
}

# Função para deletar secrets
delete_secrets() {
    echo -e "${YELLOW}=== Removendo secrets do QR Rapido ===${NC}"
    echo -e "${RED}ATENÇÃO: Isso vai remover TODOS os secrets listados!${NC}"
    read -p "Tem certeza? (digite 'sim' para confirmar): " confirm

    if [ "$confirm" != "sim" ]; then
        echo "Operação cancelada."
        exit 0
    fi

    for secret in "${SECRETS[@]}"; do
        if docker secret inspect "$secret" > /dev/null 2>&1; then
            echo -n "Removendo $secret... "
            if docker secret rm "$secret" 2>/dev/null; then
                echo -e "${GREEN}OK${NC}"
            else
                echo -e "${RED}ERRO (pode estar em uso por um service)${NC}"
            fi
        else
            echo -e "  $secret - ${YELLOW}não existe${NC}"
        fi
    done

    echo ""
    echo -e "${YELLOW}IMPORTANTE: Se algum secret estava em uso, você precisa:${NC}"
    echo "1. Parar o service: docker service rm qrrapido-prod"
    echo "2. Remover os secrets: $0 --delete"
    echo "3. Recriar os secrets: $0"
    echo "4. Recriar o service (via CI/CD ou manualmente)"
}

# Função para criar um secret
create_secret() {
    local name=$1
    local value=$2

    # Verifica se já existe
    if docker secret inspect "$name" > /dev/null 2>&1; then
        echo -e "  ${YELLOW}!${NC} $name já existe (pulando)"
        return 0
    fi

    # Cria o secret
    echo -n "  Criando $name... "
    if echo -n "$value" | docker secret create "$name" - > /dev/null 2>&1; then
        echo -e "${GREEN}OK${NC}"
        return 0
    else
        echo -e "${RED}ERRO${NC}"
        return 1
    fi
}

# Função para modo interativo
interactive_mode() {
    echo -e "${BLUE}=== Modo Interativo ===${NC}"
    echo "Você será perguntado sobre cada secret."
    echo "Pressione ENTER para pular secrets que já existem."
    echo ""

    for secret in "${SECRETS[@]}"; do
        # Verifica se já existe
        if docker secret inspect "$secret" > /dev/null 2>&1; then
            echo -e "${GREEN}✓${NC} $secret já existe"
            read -p "  Deseja recriar? (s/N): " recreate
            if [ "$recreate" != "s" ] && [ "$recreate" != "S" ]; then
                continue
            fi
            echo -n "  Removendo secret antigo... "
            docker secret rm "$secret" > /dev/null 2>&1 || true
            echo "OK"
        fi

        echo ""
        echo -e "${BLUE}$secret${NC}"
        echo "  Descrição: ${SECRET_DESCRIPTIONS[$secret]}"

        # Lê o valor (sem mostrar na tela)
        read -s -p "  Valor: " value
        echo ""

        if [ -z "$value" ]; then
            echo -e "  ${YELLOW}Pulando (valor vazio)${NC}"
            continue
        fi

        create_secret "$secret" "$value"
    done

    echo ""
    echo -e "${GREEN}=== Concluído ===${NC}"
    list_secrets
}

# Função para ler de variáveis de ambiente
from_env_mode() {
    echo -e "${BLUE}=== Lendo de variáveis de ambiente ===${NC}"

    local errors=0
    for secret in "${SECRETS[@]}"; do
        local env_var=$(echo "$secret" | tr '[:lower:]' '[:upper:]')
        local value="${!env_var}"

        if [ -z "$value" ]; then
            echo -e "  ${RED}✗${NC} $env_var não está definida"
            errors=$((errors + 1))
        else
            create_secret "$secret" "$value"
        fi
    done

    if [ $errors -gt 0 ]; then
        echo ""
        echo -e "${RED}$errors variável(is) de ambiente não encontrada(s).${NC}"
        exit 1
    fi

    echo ""
    echo -e "${GREEN}=== Concluído ===${NC}"
}

# Função para ler de arquivo
from_file_mode() {
    local file=$1

    if [ ! -f "$file" ]; then
        echo -e "${RED}ERRO: Arquivo não encontrado: $file${NC}"
        exit 1
    fi

    echo -e "${BLUE}=== Lendo de arquivo: $file ===${NC}"

    # Carrega as variáveis do arquivo
    set -a
    source "$file"
    set +a

    # Usa o modo from_env
    from_env_mode
}

# =============================================================================
# MAIN
# =============================================================================

# Verifica se está no Swarm (exceto para --help)
if [ "$1" != "--help" ] && [ "$1" != "-h" ]; then
    check_swarm
fi

# Processa argumentos
case "$1" in
    --help|-h)
        show_usage
        ;;
    --list)
        list_secrets
        ;;
    --check)
        check_secrets
        ;;
    --delete)
        delete_secrets
        ;;
    --from-env)
        from_env_mode
        ;;
    --from-file)
        if [ -z "$2" ]; then
            echo -e "${RED}ERRO: Especifique o arquivo .env${NC}"
            echo "Uso: $0 --from-file secrets.env"
            exit 1
        fi
        from_file_mode "$2"
        ;;
    "")
        interactive_mode
        ;;
    *)
        echo -e "${RED}Opção desconhecida: $1${NC}"
        show_usage
        exit 1
        ;;
esac
