modules/IntuneGraph.psm1

# Auto-import necessary Graph modules
Import-Module Microsoft.Graph.DeviceManagement.Actions -ErrorAction SilentlyContinue
Import-Module Microsoft.Graph.DeviceManagement -ErrorAction SilentlyContinue
Import-Module Microsoft.Graph.DeviceManagement.Configuration -ErrorAction SilentlyContinue


function Test-GraphConnection {
    try {
        $context = Get-MgContext
        if ($null -ne $context -and $context.Scopes -contains "Device.Read.All") {
            return $true
        } else {
            return $false
        }
    } catch {
        return $false
    }
}

function Get-IntuneDevice {
    param (
        [string]$deviceName
    )
    
    Get-MgDeviceManagementManagedDevice -Filter "deviceName eq '$deviceName'" -ErrorAction SilentlyContinue    
}

function Invoke-IntuneDeviceSync {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$DeviceId
    )
    
    try {
        $uri = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/$DeviceId/syncDevice"
        Invoke-MgGraphRequest -Method POST -Uri $uri
        $output = "Sync initiated for device ID: $DeviceId"
    } catch {
        $output = "ERROR: Failed to sync device: $_"
    }
    
    $output
}


function Get-IntuneDeviceStatus {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$DeviceId
    )

    try {
        $output = Get-MgDeviceManagementManagedDevice -ManagedDeviceId $DeviceId
    } catch {
        $output = "ERROR: Failed to retrieve device status: $_"
    }
    
    if ($output.LastSyncDateTime) {
        $output | Add-Member -NotePropertyName LocalLastSyncDateTime -NotePropertyValue $output.LastSyncDateTime.ToLocalTime() -Force
    }
    
    $output | Select-Object DeviceName, OperatingSystem, ComplianceState, LocalLastSyncDateTime, LastSyncDateTime, Model
}

function Get-IntuneComplianceState {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$DeviceId
    )

    try {
        $output = (Get-MgDeviceManagementManagedDevice -ManagedDeviceId $DeviceId).ComplianceState
    } catch {
        $output = "ERROR: Failed to retrieve compliance state: $_"
    }
    
    $output
}

function Get-IntuneAssignedConfigurations {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$DeviceId
    )

    try {
        $output = Get-MgDeviceManagementManagedDeviceConfigurationState -ManagedDeviceId $DeviceId
    } catch {
        $output = "ERROR: Failed to retrieve assigned configurations: $_"
    }
    
    $output
}

function Get-IntuneUpdatePolicy {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$DeviceId
    )
    
    try {
        $states = Get-MgDeviceManagementManagedDeviceConfigurationState -ManagedDeviceId $DeviceId        
        return $states
    } catch {
        $states = "ERROR: Failed to retrieve update policy: $_"
    }
    
    $states
}


function Connect-GraphWithDeviceRead {
    try {
        Connect-MgGraph -Scopes "DeviceManagementManagedDevices.Read.All", "DeviceManagementConfiguration.Read.All", "Device.Read.All", "DeviceManagementManagedDevices.PrivilegedOperations.All"
    } catch {
        Write-Error "Failed to connect to Microsoft Graph: $_"
    }
}