#!/usr/bin/env bash

# =============================================================================
# BAO - Back-office Admin Operations
# Menu principal interactif pour gérer les données Geosector
# =============================================================================

set -euo pipefail

# Répertoire du script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BAO_ROOT="$(dirname "$SCRIPT_DIR")"
ENV_FILE="$BAO_ROOT/config/.env"

# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color

# Fonctions d'affichage
log_info() {
    echo -e "${BLUE}ℹ${NC} $*"
}

log_success() {
    echo -e "${GREEN}✓${NC} $*"
}

log_error() {
    echo -e "${RED}✗${NC} $*" >&2
}

log_warning() {
    echo -e "${YELLOW}⚠${NC} $*"
}

# Affiche le titre principal
show_header() {
    clear
    echo -e "${CYAN}"
    cat << "EOF"
╔════════════════════════════════════════════════════════════════╗
║                                                                ║
║   ██████╗  █████╗  ██████╗                                    ║
║   ██╔══██╗██╔══██╗██╔═══██╗                                   ║
║   ██████╔╝███████║██║   ██║                                   ║
║   ██╔══██╗██╔══██║██║   ██║                                   ║
║   ██████╔╝██║  ██║╚██████╔╝                                   ║
║   ╚═════╝ ╚═╝  ╚═╝ ╚═════╝                                    ║
║                                                                ║
║   Back-office Admin Operations - Geosector                    ║
║                                                                ║
╚════════════════════════════════════════════════════════════════╝
EOF
    echo -e "${NC}\n"
}

# Charge une variable depuis .env
get_env_var() {
    local key="$1"
    grep "^${key}=" "$ENV_FILE" 2>/dev/null | cut -d'=' -f2- | tr -d ' "'
}

# Sélectionne l'environnement
select_environment() {
    echo -e "${BOLD}Sélectionnez un environnement :${NC}\n"

    local envs=()
    local counter=1

    for env in DVA RCA PRA; do
        local enabled=$(get_env_var "${env}_ENABLED")
        if [[ "$enabled" == "true" ]]; then
            local ssh_host=$(get_env_var "${env}_SSH_HOST")
            echo -e "  ${GREEN}${counter})${NC} ${BOLD}${env}${NC} (${ssh_host})"
            envs+=("$env")
            ((counter++))
        else
            echo -e "  ${YELLOW}-${NC} ${env} ${YELLOW}(désactivé)${NC}"
        fi
    done

    echo -e "  ${RED}q)${NC} Quitter\n"

    while true; do
        read -p "Votre choix: " choice

        if [[ "$choice" == "q" || "$choice" == "Q" ]]; then
            echo ""
            log_info "Au revoir !"
            exit 0
        fi

        if [[ "$choice" =~ ^[0-9]+$ ]] && [[ $choice -ge 1 ]] && [[ $choice -le ${#envs[@]} ]]; then
            SELECTED_ENV="${envs[$((choice-1))]}"
            return 0
        fi

        log_error "Choix invalide"
    done
}

# Affiche le menu des actions
show_action_menu() {
    echo -e "\n${BOLD}═══════════════════════════════════════════════════════════════${NC}"
    echo -e "${BOLD}Environnement: ${GREEN}${SELECTED_ENV}${NC}"
    echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}\n"

    echo -e "${BOLD}Actions disponibles :${NC}\n"

    echo -e "  ${CYAN}1)${NC} Lister les utilisateurs"
    echo -e "  ${CYAN}2)${NC} Décrypter un utilisateur spécifique"
    echo -e "  ${CYAN}3)${NC} Rechercher par email"
    echo -e "  ${CYAN}4)${NC} Lister les entités (amicales)"
    echo -e "  ${CYAN}5)${NC} Décrypter une entité spécifique"
    echo -e "  ${CYAN}6)${NC} État des tunnels SSH"
    echo -e "  ${CYAN}7)${NC} Fermer tous les tunnels"
    echo -e "  ${YELLOW}8)${NC} Changer d'environnement"
    echo -e "  ${RED}q)${NC} Quitter\n"
}

# Execute une action
execute_action() {
    local action="$1"

    case "$action" in
        1)
            echo ""
            read -p "Filtrer par entité ? (ID ou vide): " entite_filter
            read -p "Filtrer par rôle ? (ID ou vide): " role_filter
            read -p "Limite de résultats ? (défaut: 50): " limit_input

            local cmd="$SCRIPT_DIR/list-users $SELECTED_ENV"
            [[ -n "$entite_filter" ]] && cmd="$cmd --entite=$entite_filter"
            [[ -n "$role_filter" ]] && cmd="$cmd --role=$role_filter"
            [[ -n "$limit_input" ]] && cmd="$cmd --limit=$limit_input"

            echo ""
            $cmd
            ;;

        2)
            echo ""
            read -p "ID de l'utilisateur: " user_id

            if [[ -z "$user_id" || ! "$user_id" =~ ^[0-9]+$ ]]; then
                log_error "ID invalide"
                return 1
            fi

            echo ""
            "$SCRIPT_DIR/decrypt-user" "$SELECTED_ENV" "$user_id"
            ;;

        3)
            echo ""
            read -p "Email à rechercher: " email

            if [[ -z "$email" ]]; then
                log_error "Email vide"
                return 1
            fi

            echo ""
            "$SCRIPT_DIR/search-email" "$SELECTED_ENV" "$email"
            ;;

        4)
            echo ""
            read -p "Uniquement les entités avec Stripe ? (o/N): " stripe_filter
            read -p "Limite de résultats ? (défaut: 50): " limit_input

            local cmd="$SCRIPT_DIR/list-entites $SELECTED_ENV"
            [[ "$stripe_filter" == "o" || "$stripe_filter" == "O" ]] && cmd="$cmd --stripe"
            [[ -n "$limit_input" ]] && cmd="$cmd --limit=$limit_input"

            echo ""
            $cmd
            ;;

        5)
            echo ""
            read -p "ID de l'entité: " entite_id

            if [[ -z "$entite_id" || ! "$entite_id" =~ ^[0-9]+$ ]]; then
                log_error "ID invalide"
                return 1
            fi

            echo ""
            "$SCRIPT_DIR/decrypt-entite" "$SELECTED_ENV" "$entite_id"
            ;;

        6)
            echo ""
            "$SCRIPT_DIR/_ssh-tunnel.sh" status
            ;;

        7)
            echo ""
            "$SCRIPT_DIR/_ssh-tunnel.sh" close-all
            ;;

        8)
            return 2  # Signal pour changer d'environnement
            ;;

        q|Q)
            echo ""
            log_info "Fermeture des tunnels..."
            "$SCRIPT_DIR/_ssh-tunnel.sh" close-all
            echo ""
            log_success "Au revoir !"
            exit 0
            ;;

        *)
            log_error "Action invalide"
            return 1
            ;;
    esac

    return 0
}

# Boucle principale
main() {
    if [[ ! -f "$ENV_FILE" ]]; then
        log_error "Fichier .env introuvable: $ENV_FILE"
        log_info "Copiez config/.env.example vers config/.env"
        exit 1
    fi

    # Vérifier que PHP est installé
    if ! command -v php >/dev/null 2>&1; then
        log_error "PHP n'est pas installé"
        exit 1
    fi

    while true; do
        show_header
        select_environment

        while true; do
            show_header
            show_action_menu

            read -p "Votre choix: " action

            execute_action "$action"
            local exit_code=$?

            if [[ $exit_code -eq 2 ]]; then
                # Changer d'environnement
                break
            fi

            echo ""
            read -p "Appuyez sur Entrée pour continuer..."
        done
    done
}

# Gestion de Ctrl+C
trap 'echo ""; log_info "Fermeture des tunnels..."; $SCRIPT_DIR/_ssh-tunnel.sh close-all 2>/dev/null; echo ""; exit 0' INT

main "$@"
