using namespace Microsoft.Win32;

. "$PSScriptRoot/../../../lib/Software.ps1";
. "$PSScriptRoot/../../../Common/Types/InstallerAction.ps1";

& {
    . "$PSScriptRoot/../../lib/Registry.ps1";
    . "$PSScriptRoot/../../lib/Restoration.ps1";
    . "$PSScriptRoot/../../../lib/Settings.ps1";
    . "$PSScriptRoot/../../../lib/System.ps1";

    $userFolders = @(
        "Pictures",
        "Documents",
        "Downloads",
        "Music",
        "Videos"
    );

    $userExclusions = @(
        "Documents/Eigene*",
        "Documents/My Games",
        "Documents/My Music",
        "Documents/My Pictures",
        "Documents/My Videos"
    );

    [string[]] $homeExclusions = Get-Content "$PSScriptRoot/Home.exclude.txt";

    Start-SoftwareInstaller -Force @args `
        -Backup {
            Add-BackupArtifacts -Source "$env:PUBLIC" -Path "Public" `
                -Include ($userFolders) `
                -Exclude ($userExclusions + @("Documents/Hyper-V", "Documents/reWASD"));
        } `
        -Configurator {
            $dir = New-TemporaryDirectory;
            Push-Location $dir;

            # Copy keyboard layout
            # ToDo: Why not NewUser? Investiagte!
            Copy-UserInternationalSettingsToSystem -WelcomeScreen $True -NewUser $False;

            if (Get-OSConfig "legacyIconSpacing") {
                Write-Host "Setting up old-school Desktop Icon spacing";

                Edit-DefaultUserKey {
                    param (
                        [RegistryKey] $Key
                    )

                    $property = "IconSpacing";
                    $relativePath = "Control Panel\Desktop\WindowMetrics"
                    $path = "$($Key.PSPath)\$relativePath";
                    Copy-ItemProperty "HKCU:\$relativePath" $path $property;
                    Rename-ItemProperty $path $property "_$property";
                    Set-ItemProperty $path -Name $property -Value "-1710" -Type "String";
                };
            }

            if (-not (Get-OSConfig "dynamicLighting")) {
                Write-Host "Disabling Dynamic Lighting";

                Edit-DefaultUserKey {
                    param (
                        [RegistryKey] $Key
                    )

                    $path = "$($Key.PSPath)\Software\Microsoft\Lighting";
                    $null = New-Item $path -ErrorAction SilentlyContinue;
                    Set-ItemProperty $path -Name "AmbientLightingEnabled" -Value 0 -Type "DWord";
                };
            }

            if (-not (Get-OSConfig "adware")) {
                $startLayoutFile = "start.json";
                Write-Host "Removing adware";

                Remove-DesktopIcon "*Microsoft Edge*";

                Edit-DefaultUserKey {
                    param (
                        [RegistryKey] $Key
                    )

                    $winKey = "$($Key.PSPath)\Software\Microsoft\Windows\CurrentVersion";
                    $contentDeliveryKey = "$winKey\ContentDeliveryManager";
                    $cloudContentKey = "HKLM:\Software\Policies\Microsoft\Windows\CloudContent";

                    foreach ($path in @($contentDeliveryKey, $cloudContentKey)) {
                        if (-not (Test-Path $path)) {
                            $null = New-Item $path;
                        }
                    }

                    # Set-ItemProperty $cloudContentKey -Name "DisableWindowsConsumerFeatures" -Value 1 -Type "DWord";
                    Set-ItemProperty $cloudContentKey -Name "DisableCloudOptimizedContent" -Value 1 -Type "DWord";
                    Set-ItemProperty $cloudContentKey -Name "DisableConsumerAccountStateContent" -Value 1 -Type "DWord";

                    # Disabling Personal MS Teams Icon
                    Set-ItemProperty "$winKey\Explorer\Advanced" -Name "TaskBarMn" -Value 0 -Type "DWord";
                    Set-ItemProperty $contentDeliveryKey -Name "ContentDeliveryAllowed" -Value 0 -Type "DWord";
                    Set-ItemProperty $contentDeliveryKey -Name "SilentInstalledAppsEnabled" -Value 0 -Type "DWord";
                    Set-ItemProperty $contentDeliveryKey -Name "SystemPaneSuggestionsEnabled" -Value 0 -Type "DWord";
                };

                Write-Host "Removing ads from pinned apps";
                Export-StartLayout $startLayoutFile;

                $startLayout = Get-Content $startLayoutFile | ConvertFrom-Json;
                $property = "pinnedList";

                $newLayout = $startLayout | Select-Object -ExpandProperty $property | Where-Object {
                    -not (
                        ($_.desktopAppLink -like "*Microsoft Edge*") -or
                        [System.Linq.Enumerable]::Any(
                            @(
                                "*MicrosoftOfficeHub*",
                                "*SpotifyMusic*",
                                "*WhatsApp*",
                                "*PrimeVideo*",
                                "*Netflix*",
                                "*Instagram*",
                                "*ChipChamp*",
                                "*Facebook*",
                                "*LinkedIn*"),
                            [System.Func[System.Object, bool]] {
                                param($pattern)
                                $_.packagedAppId -like "$pattern";
                            }));
                };

                $startLayout.PSObject.Properties.Remove($property);
                $startLayout | Add-Member -NotePropertyName $property -NotePropertyValue $newLayout;

                $startLayout | ConvertTo-Json -Compress | Set-Content "$env:SystemDrive\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.json";
            }

            if (Get-OSConfig "showFileExt") {
                Edit-DefaultUserKey {
                    param (
                        [RegistryKey] $Key
                    )

                    Set-ItemProperty "$($Key.PSPath)\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "HideFileExt" -Value 0 -Type "DWord";
                };
            }

            Pop-Location;
            Remove-Item -Recurse $dir;
            Expand-BackupArtifacts -Path "Public" -Target $env:PUBLIC;
        } `
        -UserBackup {
            param(
                [hashtable] $Arguments
            )

            Add-BackupArtifacts -User $Arguments.Name -Source $HOME -Path "Home" -Include ($userFolders) -Exclude ($userExclusions + $homeExclusions);
        } `
        -UserConfigurator {
            param(
                [hashtable] $Arguments
            )

            Expand-BackupArtifacts -User $Arguments.Name -Path "Home" -Target $HOME;

            if (-not (Get-OSConfig "adware")) {
                Remove-DesktopIcon "*Microsoft Edge*";
            }
        };
} @args;