. "$PSScriptRoot/../Scripts/Context.ps1";
$uacDisablerName = "PortValhalla UAC Disabler";
$cleanupName = "PortValhalla Cleanup";

function New-PersonalUser([Context] $context)
{
    if (-not (Get-LocalUser $context.UserName))
    {
        Write-Host "Creating Personal User";

        while ($true) {
            Write-Host (
                [string]::Join(
                    "`n",
                    "So... Windows is too dumb to create users which are bound to a Microsoft Account.",
                    "Thus, you have to do it by yourself.",
                    "So sorry..."));

            $users = Get-LocalUser | ForEach-Object { $_.Name };
            Write-Host "Following users exist already:"
            Write-Host $users;
            Read-Host "Please hit enter once you're done...";

            $user = Get-LocalUser | Where-Object { -not ($users -contains $_.Name) } | Select-Object -Last 1;

            if ($user) {
                Write-Information "Found New User:";
                Write-Information $user;
                break;
            }
        }

        Write-Information "Renaming the new User to $($context.UserName)";
        Rename-LocalUser $user $context.UserName;
        Add-LocalGroupMember -Group "Administrators" -Member $user && Set-LocalUser $context.AdminName -Password (ConvertTo-SecureString -AsPlainText "Admin") && Disable-LocalUser $context.AdminName;

        Write-Host "Registering setup script for all new users";
        $context.RegisterNewUserReboot();

        Write-Information "Enabling UAC for the next login (Microsoft Account login won't work otherwise, lol)";
        Enable-UACNextLogin;

        Write-Information "Disabling Auto login";
        $context.RemoveAutologin();
        Restart-Computer;
        exit;
    }
    elseif ((Get-ScheduledTask $uacDisablerName))
    {
        while ((Get-ScheduledTask $uacDisablerName) -ne "Ready")
        {
            Start-Sleep 1;
        }

        $taskInfo = Get-ScheduledTask $uacDisablerName;

        if ($taskInfo.LastTaskResult -ne 0)
        {
            Write-Error "Disabling UAC was unsuccessful.";
        }

        Start-ScheduledTask $cleanupName;
    }
}

function Enable-UACNextLogin() {
    $keyPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System";
    $propertyName = "EnableLUA";
    $null = Set-ItemProperty "$keyPath" -Name "$propertyName" -Value 1;

    $action = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument (
        [string]::Join(
            " ",
            @(
                "-c",
                "Set-ItemProperty `"$keyPath`" -Name `"$propertyName`" -Value 0;")));

    $trigger = New-ScheduledTaskTrigger -AtLogOn;
    $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest;
    $task = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger;
    $null = Register-ScheduledTask $uacDisablerName -InputObject $task;

    $action = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument (
        [string]::Join(
            " ",
            @(
                "-c",
                "Unregister-ScheduledTask -Force $uacDisablerName;",
                "Unregister-ScheduledTask -Force $cleanupName;")));

    $task = New-ScheduledTask -Action $action -Principal $principal;
    $null = Register-ScheduledTask $cleanupName -InputObject $task;
}