#!/bin/bash
################################################################################
# FINAL SCRIPT (macOS): Zabbix Agent 2 & AnyDesk Installation + Hostname Change
# With active checks configured to zabbix-01.smartgroep.be (Smartgroep server)
################################################################################

# === Internal Config ===
ZABBIX_AGENT2_URL="https://cdn.zabbix.com/zabbix/binaries/stable/7.2/7.2.7/zabbix_agent2-7.2.7-macos-amd64-gnutls.tar.gz"
ANYDESK_DMG_URL="https://my.anydesk.com/v2/api/v2/custom-clients/downloads/public/F9S6ZF3LBHWI/sg-support-mac.dmg"
WEBHOOK_URL="https://hook.eu2.make.com/wkthpoc25tutd6olhee4sf2qmynf8fbu"
ZBX_INSTALL_DIR="/usr/local/zabbix"
ZBX_CONFIG="${ZBX_INSTALL_DIR}/conf/zabbix_agent2.conf"
ZBX_SERVER_ACTIVE="zabbix-01.smartgroep.be"

# === Helpers ===
RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[0;33m'; RESET='\033[0m'
function show_message() { echo -e "[\033[0;36m$(date +'%H:%M:%S')\033[0m] ${2:-$CYAN}$1$RESET"; }
function pause_for_user() { echo -e "\nPress Enter to continue..."; read -r; }

# === Root Check ===
if [[ $EUID -ne 0 ]]; then echo -e "${RED}ERROR: Run as root or use sudo.${RESET}"; exit 1; fi

# === Step 1: User Input ===
clear
show_message "===== STEP 1: GATHER USER INPUT ====="
read -r -p "Enter the client name: " CLIENT_NAME
read -r -p "Enter the full name of the user using this Mac: " USER_FULL_NAME
ORIGINAL_HOSTNAME="$(scutil --get ComputerName 2>/dev/null || hostname)"
NEW_HOSTNAME=""
FINAL_HOSTNAME=""

# === Step 2: Optional Hostname Change ===
clear
show_message "===== STEP 2: OPTIONAL HOSTNAME CHANGE ====="
read -r -p "Change hostname? Type 'y' to proceed or press Enter to skip: " ANSWER
function is_valid_hostname() {
  [[ "$1" =~ ^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?$ ]]
}
if [[ "${ANSWER,,}" == "y" ]]; then
  while true; do
    read -r -p "Enter new hostname (or press Enter to cancel): " tempHostname
    [[ -z "$tempHostname" ]] && { show_message "Keeping original hostname."; break; }
    is_valid_hostname "$tempHostname" && { NEW_HOSTNAME="$tempHostname"; break; } || show_message "Invalid hostname." "$RED"
  done
fi
FINAL_HOSTNAME="${NEW_HOSTNAME:-$ORIGINAL_HOSTNAME}"
[[ -n "$NEW_HOSTNAME" ]] && {
  show_message "Applying hostname: $NEW_HOSTNAME" "$YELLOW"
  scutil --set ComputerName "$NEW_HOSTNAME"
  scutil --set HostName "$NEW_HOSTNAME"
  scutil --set LocalHostName "$NEW_HOSTNAME"
}

# === Step 3: Summary ===
clear
show_message "===== STEP 3: SHOW COLLECTED DATA ====="
echo -e "${GREEN} Client Name:       $CLIENT_NAME\n User Full Name:    $USER_FULL_NAME\n Original Hostname: $ORIGINAL_HOSTNAME\n Final Hostname:    $FINAL_HOSTNAME${RESET}"
pause_for_user

# === Step 4: Install Zabbix + AnyDesk ===
clear
show_message "===== STEP 4: INSTALL ZABBIX & ANYDESK ====="

# 4.1 Zabbix
show_message "Downloading Zabbix Agent 2..." "$YELLOW"
curl -L -o /tmp/zabbix_agent2.tar.gz "$ZABBIX_AGENT2_URL" || { show_message "Failed to download Zabbix." "$RED"; exit 1; }
mkdir -p "$ZBX_INSTALL_DIR"
tar -zxvf /tmp/zabbix_agent2.tar.gz -C "$ZBX_INSTALL_DIR" >/dev/null 2>&1
rm -f /tmp/zabbix_agent2.tar.gz
mkdir -p "$ZBX_INSTALL_DIR/logs"
cat <<EOF > "$ZBX_CONFIG"
ServerActive=$ZBX_SERVER_ACTIVE
Hostname=$FINAL_HOSTNAME
LogFile=$ZBX_INSTALL_DIR/logs/zabbix_agent2.log
EOF

# LaunchDaemon
PLIST="/Library/LaunchDaemons/com.zabbix.agent2.plist"
cat <<EOF > "$PLIST"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>com.zabbix.agent2</string>
 <key>ProgramArguments</key>
 <array>
   <string>$ZBX_INSTALL_DIR/sbin/zabbix_agent2</string>
   <string>-c</string>
   <string>$ZBX_CONFIG</string>
 </array>
 <key>RunAtLoad</key>
 <true/>
 <key>KeepAlive</key>
 <true/>
 <key>StandardOutPath</key>
 <string>$ZBX_INSTALL_DIR/logs/zabbix_agent2_launchd.log</string>
 <key>StandardErrorPath</key>
 <string>$ZBX_INSTALL_DIR/logs/zabbix_agent2_launchd.log</string>
</dict>
</plist>
EOF

chown root:wheel "$PLIST"
chmod 644 "$PLIST"
launchctl unload "$PLIST" >/dev/null 2>&1
launchctl load "$PLIST"
launchctl start com.zabbix.agent2
show_message "Zabbix Agent 2 installed and launched." "$GREEN"

# 4.2 AnyDesk
show_message "Downloading AnyDesk..." "$YELLOW"
curl -L -o /tmp/anydesk.dmg "$ANYDESK_DMG_URL" || { show_message "Failed to download AnyDesk." "$RED"; exit 1; }
hdiutil attach /tmp/anydesk.dmg -nobrowse -quiet
MOUNT_POINT=$(hdiutil info | grep "/Volumes" | grep -i "AnyDesk" | awk '{print $1}')
cp -R "$MOUNT_POINT/AnyDesk.app" /Applications/
hdiutil detach "$MOUNT_POINT" -quiet
rm -f /tmp/anydesk.dmg
show_message "AnyDesk installed." "$GREEN"
pause_for_user

# === Step 5: Send Webhook ===
clear
show_message "===== STEP 5: SEND WEBHOOK DATA ====="
JSON_PAYLOAD="$(cat <<EOF
{
  "client_name": "$CLIENT_NAME",
  "user_full_name": "$USER_FULL_NAME",
  "original_hostname": "$ORIGINAL_HOSTNAME",
  "new_hostname": "$NEW_HOSTNAME",
  "final_hostname": "$FINAL_HOSTNAME",
  "OS": "Mac_OS"
}
EOF
)"
RESPONSE=$(curl -s -o /tmp/hook_resp.json -w '%{http_code}' -X POST -H "Content-Type: application/json" -d "$JSON_PAYLOAD" "$WEBHOOK_URL")
[[ "$RESPONSE" =~ ^20[0-2]$ ]] && {
  show_message "Webhook successful!" "$GREEN"
  echo -e " Client: $CLIENT_NAME\n User:   $USER_FULL_NAME\n Host:   $FINAL_HOSTNAME"
} || {
  show_message "Webhook failed! HTTP $RESPONSE" "$RED"
  echo -e "Check /tmp/hook_resp.json for error details."
}

echo -e "\n${CYAN}Script finished. Press Enter to close...${RESET}"
read -r
exit 0