#!/usr/bin/env bash

MODULE_USER_SUDO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MODULE_USER_SUDO_PROJECT_ROOT="$(cd "$MODULE_USER_SUDO_DIR/../../.." && pwd)"

# shellcheck source=lib/package.sh
source "$MODULE_USER_SUDO_PROJECT_ROOT/lib/package.sh"
# shellcheck source=modules/system/user-sudo/config.sh
source "$MODULE_USER_SUDO_DIR/config.sh"
# shellcheck source=modules/system/user-sudo/metadata.conf
source "$MODULE_USER_SUDO_DIR/metadata.conf"

module_user_sudo_require_package() {
  if package_is_installed "sudo"; then
    ui_info "Paquet sudo deja installe"
    return 0
  fi

  ui_warn "Paquet sudo absent, installation en cours"
  package_refresh_indexes
  package_install sudo
  log_info "Paquet sudo installe"
  ui_success "Paquet sudo installe"
}

module_user_sudo_metadata() {
  printf '%s|%s|%s\n' "$MODULE_ID" "$MODULE_NAME" "$MODULE_DESCRIPTION"
}

module_user_sudo_check() {
  local target_user="${1:-$POSTINSTALL_USER_SUDO_TARGET_USER}"

  if ! package_is_installed "sudo"; then
    ui_warn "Paquet sudo non installe"
    return 1
  fi

  if ! system_user_exists "$target_user"; then
    ui_error "Utilisateur introuvable : $target_user"
    return 1
  fi

  if ! system_group_exists "$POSTINSTALL_USER_SUDO_TARGET_GROUP"; then
    ui_error "Groupe requis introuvable : $POSTINSTALL_USER_SUDO_TARGET_GROUP"
    return 1
  fi

  if system_user_in_group "$target_user" "$POSTINSTALL_USER_SUDO_TARGET_GROUP"; then
    ui_success "Utilisateur $target_user deja membre du groupe sudo"
    return 0
  fi

  ui_warn "Utilisateur $target_user non membre du groupe sudo"
  return 1
}

module_user_sudo_install() {
  local target_user="${1:-$POSTINSTALL_USER_SUDO_TARGET_USER}"

  module_user_sudo_require_package || return 1

  if ! system_user_exists "$target_user"; then
    ui_error "Impossible de configurer sudo : utilisateur absent ($target_user)"
    return 1
  fi

  if ! system_group_exists "$POSTINSTALL_USER_SUDO_TARGET_GROUP"; then
    ui_error "Impossible de configurer sudo : groupe absent ($POSTINSTALL_USER_SUDO_TARGET_GROUP)"
    return 1
  fi

  if system_user_in_group "$target_user" "$POSTINSTALL_USER_SUDO_TARGET_GROUP"; then
    log_info "Aucun changement sudo requis pour $target_user"
    ui_info "Aucun changement : $target_user est deja dans sudo"
  else
    usermod -aG "$POSTINSTALL_USER_SUDO_TARGET_GROUP" "$target_user"
    log_info "Utilisateur $target_user ajoute au groupe sudo"
    ui_success "Utilisateur $target_user ajoute au groupe sudo"
  fi

  module_user_sudo_configure "$target_user"
}

module_user_sudo_configure() {
  local target_user="${1:-$POSTINSTALL_USER_SUDO_TARGET_USER}"

  if command -v visudo >/dev/null 2>&1; then
    visudo -cf /etc/sudoers >/dev/null
    log_info "Validation visudo reussie pour $target_user"
    ui_success "Configuration sudo validee avec visudo"
  else
    ui_warn "visudo indisponible, validation sudo non effectuee"
  fi
}

module_user_sudo_test() {
  local target_user="${1:-$POSTINSTALL_USER_SUDO_TARGET_USER}"

  package_is_installed "sudo" || return 1
  system_user_exists "$target_user" || return 1
  system_group_exists "$POSTINSTALL_USER_SUDO_TARGET_GROUP" || return 1
  system_user_in_group "$target_user" "$POSTINSTALL_USER_SUDO_TARGET_GROUP"
}
