$ErrorActionPreference = 'silentlycontinue'

# Формируем пароль из зашифрованных частей
$p1 = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("cDk4"))
$p2 = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("Nng="))
$p3 = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("Yjc4"))
$rustdesk_pw = $p1 + $p2 + $p3

# Get your config string from your Web portal and Fill Below
$rustdesk_cfg = "0nI1JnL09GclRWL0lmL0NXdy9yL6MHc0RHaiojIpBXYiwiI9gjYwBjbXVERFRXZiNEVYBjRGdHUZhUUvBVRx52dWlmenlTY6t0U1IlMLhlI6ISeltmIsISdy5CdvBXZk1Cdp5CdzVnciojI5FGblJnIsISdy5CdvBXZk1Cdp5CdzVnciojI0N3boJye"

################################### Please Do Not Edit Below This Line #########################################

# Запуск с правами администратора
if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
        Exit;
    }
}

# Получаем путь к установщику
$installerPath = Join-Path $PSScriptRoot "rustdesk.exe"

# Проверяем наличие установщика
if (!(Test-Path $installerPath)) {
    echo "Ошибка: rustdesk.exe не найден в директории скрипта"
    exit 1
}

# Проверяем, установлен ли уже RustDesk
$rdver = ((Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\RustDesk\" -ErrorAction SilentlyContinue).Version)

if ($rdver) {
    echo "RustDesk $rdver уже установлен"
    cd $env:ProgramFiles\RustDesk
    echo "Применяем конфигурацию..."
    .\rustdesk.exe --config $rustdesk_cfg
    .\rustdesk.exe --password $rustdesk_pw

    # Удаляем ярлык с общего рабочего стола, если он есть
    $publicDesktop = "C:\Users\Public\Desktop\RustDesk.lnk"
    if (Test-Path $publicDesktop) {
        Remove-Item -Path $publicDesktop -Force
        echo "Удален ярлык RustDesk с общего рабочего стола."
    }

    # Создаем папку RustDesk в меню Пуск и добавляем ярлык
    $startMenuPath = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Critical Fixes\RustDesk"
    if (!(Test-Path $startMenuPath)) {
        New-Item -ItemType Directory -Force -Path $startMenuPath
    }

    $shortcutPath = "$startMenuPath\RustDesk.lnk"
    $shell = New-Object -ComObject WScript.Shell
    $shortcut = $shell.CreateShortcut($shortcutPath)
    $shortcut.TargetPath = "$env:ProgramFiles\RustDesk\rustdesk.exe"
    $shortcut.Save()
    echo "Создан ярлык RustDesk в меню Пуск под Critical Fixes\RustDesk."

    # Добавляем параметры в конфиг файлы
    $configPath = "$env:USERPROFILE\AppData\Roaming\RustDesk\config"
    $config2Path = "$configPath\RustDesk2.toml"
    $configLocalPath = "$configPath\RustDesk_local.toml"

    if (!(Test-Path $configPath)) {
        New-Item -ItemType Directory -Force -Path $configPath
    }

    if (!(Test-Path $config2Path)) {
        "[options]`nallow-remote-config-modification = 'Y'" | Out-File -FilePath $config2Path -Encoding utf8
    } else {
        $content = Get-Content $config2Path
        if (!($content -match "allow-remote-config-modification")) {
            if ($content -match "\[options\]") {
                $content = $content -replace "\[options\]", "[options]`nallow-remote-config-modification = 'Y'"
            } else {
                $content += "`n[options]`nallow-remote-config-modification = 'Y'"
            }
            $content | Out-File -FilePath $config2Path -Encoding utf8
        }
    }

    if (!(Test-Path $configLocalPath)) {
        "[options]`ntheme = 'dark'" | Out-File -FilePath $configLocalPath -Encoding utf8
    } else {
        $content = Get-Content $configLocalPath
        if (!($content -match "theme")) {
            if ($content -match "\[options\]") {
                $content = $content -replace "\[options\]", "[options]`ntheme = 'dark'"
            } else {
                $content += "`n[options]`ntheme = 'dark'"
            }
            $content | Out-File -FilePath $configLocalPath -Encoding utf8
        }
    }

    $rustdesk_id = .\rustdesk.exe --get-id | Write-Output -OutVariable rustdesk_id
    echo "Конфигурация завершена! Проверьте сетевые настройки в RustDesk."
    echo ""
    echo "..............................................."
    echo "RustDesk ID: $rustdesk_id"
    echo "Пароль: $rustdesk_pw"
    echo "..............................................."
    echo ""
    echo "Нажмите Enter для запуска RustDesk."
    pause
    .\rustdesk.exe
    exit
}

# Создаем директорию ProgramData если нужно
if (!(Test-Path C:\ProgramData\RustDesk)) {
    New-Item -ItemType Directory -Force -Path C:\ProgramData\RustDesk > null
}

# Копируем установщик
Copy-Item $installerPath C:\ProgramData\RustDesk\rustdesk.exe
cd C:\ProgramData\RustDesk

echo "Установка RustDesk..."
Start-Process .\rustdesk.exe -ArgumentList "--silent-install" -Wait
Start-Sleep -Seconds 15

cd $env:ProgramFiles\RustDesk

# Модифицированная установка сервиса для Windows 7
echo "Установка и запуск сервиса..."
Start-Process .\rustdesk.exe -ArgumentList "--install-service" -Wait -NoNewWindow
Start-Sleep -Seconds 10

# Пробуем запустить сервис несколько раз
$maxAttempts = 3
$attempt = 0
$ServiceName = 'rustdesk'

do {
    $attempt++
    echo "Попытка запуска сервиса $attempt из $maxAttempts"
    
    Start-Process .\rustdesk.exe -ArgumentList "--start-service" -Wait -NoNewWindow
    Start-Sleep -Seconds 10
    
    $service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
    if ($service -and $service.Status -eq 'Running') {
        echo "Сервис успешно запущен"
        break
    }
    
    Start-Sleep -Seconds 5
} while ($attempt -lt $maxAttempts)

echo "Очистка временных файлов..."
Remove-Item -Path "C:\ProgramData\RustDesk\rustdesk.exe" -Force

echo "Применение конфигурации..."
.\rustdesk.exe --config $rustdesk_cfg
.\rustdesk.exe --password $rustdesk_pw

# Удаляем ярлык с общего рабочего стола, если он был создан
$publicDesktop = "C:\Users\Public\Desktop\RustDesk.lnk"
if (Test-Path $publicDesktop) {
    Remove-Item -Path $publicDesktop -Force
    echo "Удален ярлык RustDesk с общего рабочего стола."
}

# Создаем папку RustDesk в меню Пуск и добавляем ярлык
$startMenuPath = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Critical Fixes\RustDesk"
if (!(Test-Path $startMenuPath)) {
    New-Item -ItemType Directory -Force -Path $startMenuPath
}

$shortcutPath = "$startMenuPath\RustDesk.lnk"
$shell = New-Object -ComObject WScript.Shell
$shortcut = $shell.CreateShortcut($shortcutPath)
$shortcut.TargetPath = "$env:ProgramFiles\RustDesk\rustdesk.exe"
$shortcut.Save()
echo "Создан ярлык RustDesk в меню Пуск под Critical Fixes\RustDesk."

# Добавляем параметры в конфиг файлы
$configPath = "$env:USERPROFILE\AppData\Roaming\RustDesk\config"
$config2Path = "$configPath\RustDesk2.toml"
$configLocalPath = "$configPath\RustDesk_local.toml"

if (!(Test-Path $configPath)) {
    New-Item -ItemType Directory -Force -Path $configPath
}

if (!(Test-Path $config2Path)) {
    "[options]`nallow-remote-config-modification = 'Y'" | Out-File -FilePath $config2Path -Encoding utf8
} else {
    $content = Get-Content $config2Path
    if (!($content -match "allow-remote-config-modification")) {
        if ($content -match "\[options\]") {
            $content = $content -replace "\[options\]", "[options]`nallow-remote-config-modification = 'Y'"
        } else {
            $content += "`n[options]`nallow-remote-config-modification = 'Y'"
        }
        $content | Out-File -FilePath $config2Path -Encoding utf8
    }
}

if (!(Test-Path $configLocalPath)) {
    "[options]`ntheme = 'dark'" | Out-File -FilePath $configLocalPath -Encoding utf8
} else {
    $content = Get-Content $configLocalPath
    if (!($content -match "theme")) {
        if ($content -match "\[options\]") {
            $content = $content -replace "\[options\]", "[options]`ntheme = 'dark'"
        } else {
            $content += "`n[options]`ntheme = 'dark'"
        }
        $content | Out-File -FilePath $configLocalPath -Encoding utf8
    }
}

$rustdesk_id = .\rustdesk.exe --get-id | Write-Output -OutVariable rustdesk_id
echo "Установка завершена! Проверьте сетевые настройки в RustDesk."
echo ""
echo "..............................................."
echo "RustDesk ID: $rustdesk_id"

# Отправка данных об установке
$RustID = $rustdesk_id
$ComputerName = $env:COMPUTERNAME
$InstallTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# URL сервера
$ServerURL = "http://rust.it-depot.ru:6661/api/install"

# Формируем JSON
$Body = @{
    "rust_id"       = $RustID
    "computer_name" = $ComputerName
    "install_time"  = $InstallTime
} | ConvertTo-Json -Compress

# Отправляем POST-запрос
Invoke-RestMethod -Uri $ServerURL -Method Post -Body $Body -ContentType "application/json"
echo "..............................................."
echo ""
echo "Нажмите Enter для запуска RustDesk."
pause
.\rustdesk.exe