#!/bin/bash

# --- カスタマイズ値 ---
pkgName="dxeco-desktop-agent.pkg" # アップロードされるパッケージ名

# pkgを公式のURLからWebで自動ダウンロードする場合は以下を1を指定します。
# JAMF等でクライアントマシンにキャッシュされるパッケージを使用する場合は0を指定します。
autoDownloadPkg=0

# インストール後アプリ検出を自動で開始するかどうか
# 自動で検出を開始する場合は1を指定します。
# インストール後検出は開始せずユーザ側で手動で検出の有効化を開始する場合は0を指定します。(0を指定する場合emailとinstanceNameはユーザ側で有効化時に指定します)
enableUsageCollectionValue="1"

# メールアドレスドメイン名
# メールアドレスを決定するのに使用するドメイン名を指定します。必ず適切なドメイン名に置き換えてください。
emailDomainName="example.com"

# その他、環境に応じて下部の「ユーザーメールアドレスの取得」の部分の処理をカスタマイズして下さい。
# ----------------

# --- 固定値 ---
cachedPkg="/Library/Application Support/JAMF/Waiting Room/$pkgName" # JAMF等でキャッシュされるパッケージファイルのパス
autoDownloadPkgUrl="https://s3-public.dxeco.io/agent-installer" #　公式から自動ダウンロードする場合のURL
tmpPkg="/tmp/$pkgName" # 一時的なパッケージファイルのパス

adminInstallValueName="adminInstall"
adminInstallValue="1" # 1を固定で指定します
enableUsageCollectionValueName="enableUsageCollection"
emailValueName="email"
instanceNameValueName="instanceName"
APP_NAME="dxeco-desktop-agent" # アプリ名
APP_BUNDLE_ID="com.oro.dxeco-desktop-agent" # 設定対象アプリのバンドルID
PLIST_FILENAME="${APP_BUNDLE_ID}.plist"
LOG_DIR="/Library/Logs/$APP_NAME" # ログ出力先ディレクトリ
LOG_TAG="dxeco-desktop-agent-install" # ログ識別用
# ----------------

# --- 関数: ログ出力 ---
mkdir -p "$LOG_DIR" # ログディレクトリの作成
LOG_FILE="${LOG_DIR}/${LOG_TAG}-$(date +%Y%m%d_%H%M%S).log"
log_message() {
    level="$2"
    if [ -z "$level" ]; then
        level="info"
    fi
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $1"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $1" >> "$LOG_FILE"
}
# ----------------

# --- メイン処理 ---
log_message "インストール スクリプト開始"

# 1. ログインユーザーの取得
# 現在ログインしているユーザーを取得
currentUser=$(stat -f%Su /dev/console)

# ログインユーザーがnobodyやrootでないことを確認
if [ -z "$currentUser" ] || [ "$currentUser" == "root" ] || [ "$currentUser" == "nobody" ]; then
    log_message "有効なログインユーザーが見つかりません。($currentUser)" "error"
    exit 1
fi

userHome=$(dscl . -read /Users/$currentUser NFSHomeDirectory | awk '{print $2}')
if [ -z "$userHome" ]; then
    log_message "Error: ユーザー $currentUser のホームディレクトリを取得できませんでした。" "error"
    exit 1
fi
log_message "ユーザーホームディレクトリ: $userHome"


# 2. マシン名の取得
computerName=$(scutil --get ComputerName)
log_message "マシン名: $computerName"

# 3. ユーザーメールアドレスの取得
# ---- 重要：メールアドレスの取得方法を確認してください ----
# ここではユーザ名とドメイン名を結合してメールアドレスを作成しています。
emailAddress="${currentUser}@${emailDomainName}"
log_message "メールアドレス: $emailAddress"

# 4. plist設定
plistPath="${userHome}/Library/Preferences/${PLIST_FILENAME}"
plistDir=$(dirname "$plistPath")
log_message "plistを設定します: $plistPath"

# Preferences ディレクトリが存在しない場合作成 (ユーザー権限で)
if [ ! -d "$plistDir" ]; then
    log_message "ディレクトリを作成します: $plistDir"
    sudo -u "$currentUser" mkdir -p "$plistDir"
    if [ $? -ne 0 ]; then
        log_message "Error: Preferencesディレクトリの作成に失敗しました。" "error"
        exit 1
    fi
fi

# defaults コマンドで plist に値を書き込む (ユーザー権限で実行)
log_message "  $adminInstallValueName -> $adminInstallValue"
sudo -u "$currentUser" defaults write "$plistPath" "$adminInstallValueName" -string "$adminInstallValue"
log_message "  $enableUsageCollectionValueName -> $enableUsageCollectionValue"
sudo -u "$currentUser" defaults write "$plistPath" "$enableUsageCollectionValueName" -string "$enableUsageCollectionValue"
log_message "  $emailValueName -> $emailAddress"
sudo -u "$currentUser" defaults write "$plistPath" "$emailValueName" -string "$emailAddress"
log_message "  $instanceNameValueName -> $computerName"
sudo -u "$currentUser" defaults write "$plistPath" "$instanceNameValueName" -string "$computerName"

# plist ファイルの所有権をユーザーに設定 (念のため)
sudo chown "$currentUser" "$plistPath"
sudo chmod 600 "$plistPath"
log_message "plist設定完了。"


# 5. インストールパッケージの取得
if [ "$autoDownloadPkg" -eq 1 ]; then
    # Webからダウンロードする場合
    log_message "Webからパッケージをダウンロード中: $autoDownloadPkgUrl/$pkgName"
    curl -L -f -o "$tmpPkg" "$autoDownloadPkgUrl/$pkgName"
    curl_result=$?
    if [ $curl_result -ne 0 ]; then
        log_message "Error: パッケージのダウンロードに失敗しました。($curl_result)" "error"
        exit 1
    fi
else
    # JAMF等でキャッシュされたパッケージを使用する場合
    log_message "事前にキャッシュされたパッケージを使用します: $cachedPkg"
    # pkgファイルが存在するか確認
    if [ ! -f "$cachedPkg" ]; then
        log_message "Error: キャッシュされたパッケージ '$pkgName' が見つかりません。" "error"
        exit 1
    fi
    # ユーザーが読み込める場所にパッケージをコピー
    log_message "パッケージを一時ディレクトリにコピー中: $tmpPkg"
    cp "$cachedPkg" "$tmpPkg"
fi

# 6. インストーラーの実行
# ユーザーのApplicationsディレクトリパス
userAppDir="${userHome}/Applications"
log_message "ユーザー '$currentUser' としてインストールを開始します..."
log_message "インストール先: $userAppDir"

# ユーザー権限でインストーラーを実行
# -target オプションでユーザーのホームディレクトリを指定
log_message "インストーラーを実行中: $tmpPkg"
sudo -u "$currentUser" installer -pkg "$tmpPkg" -target CurrentUserHomeDirectory

# インストールの成功・失敗を確認
installResult=$?
if [ $installResult -eq 0 ]; then
    log_message "一時ファイルを削除中..."
    rm -f "$tmpPkg"
    log_message "インストールが正常に完了しました。"
    exit 0
else
    log_message "Error: インストールに失敗しました。終了コード: $installResult" "error"
    exit 1
fi