<# 
    PC Hardware Full Report — Продвинутая версия с Авито (исправлено)
#>

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$PSDefaultParameterValues['*:Encoding'] = 'utf8'

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Web   # ← ИСПРАВЛЕНИЕ
[System.Windows.Forms.Application]::EnableVisualStyles()

$form = New-Object System.Windows.Forms.Form
$form.Text = "PC Hardware Full Report + Авито"
$form.Size = New-Object System.Drawing.Size(1080, 860)
$form.StartPosition = "CenterScreen"
$form.FormBorderStyle = "FixedSingle"
$form.BackColor = [System.Drawing.Color]::FromArgb(28, 28, 32)

# Регион
$lblRegion = New-Object System.Windows.Forms.Label
$lblRegion.Text = "Регион:"; $lblRegion.ForeColor = "White"
$lblRegion.Location = New-Object System.Drawing.Point(20, 65)
$form.Controls.Add($lblRegion)

$comboRegion = New-Object System.Windows.Forms.ComboBox
$comboRegion.Items.AddRange(@("Москва","Санкт-Петербург","Екатеринбург","Новосибирск","Краснодар","Все регионы"))
$comboRegion.SelectedIndex = 0
$comboRegion.Location = New-Object System.Drawing.Point(20,85); $comboRegion.Size = New-Object System.Drawing.Size(200,28)
$form.Controls.Add($comboRegion)

# Путь
$lblPath = New-Object System.Windows.Forms.Label; $lblPath.Text = "Папка:"; $lblPath.ForeColor = "White"
$lblPath.Location = New-Object System.Drawing.Point(240,65); $form.Controls.Add($lblPath)

$txtPath = New-Object System.Windows.Forms.TextBox
$txtPath.Text = "$env:USERPROFILE\Desktop"
$txtPath.Location = New-Object System.Drawing.Point(240,85); $txtPath.Size = New-Object System.Drawing.Size(580,28)
$form.Controls.Add($txtPath)

$btnBrowse = New-Object System.Windows.Forms.Button; $btnBrowse.Text = "Обзор"
$btnBrowse.Location = New-Object System.Drawing.Point(830,83); $btnBrowse.Size = New-Object System.Drawing.Size(90,32)
$form.Controls.Add($btnBrowse)

$btnGenerate = New-Object System.Windows.Forms.Button
$btnGenerate.Text = "▶ Сгенерировать отчёт"
$btnGenerate.Location = New-Object System.Drawing.Point(20,130)
$btnGenerate.Size = New-Object System.Drawing.Size(240,55)
$btnGenerate.BackColor = [System.Drawing.Color]::FromArgb(0,122,204)
$btnGenerate.ForeColor = "White"
$form.Controls.Add($btnGenerate)

$btnOpenAllAvito = New-Object System.Windows.Forms.Button
$btnOpenAllAvito.Text = "🌐 Открыть все на Авито"
$btnOpenAllAvito.Location = New-Object System.Drawing.Point(270,130)
$btnOpenAllAvito.Size = New-Object System.Drawing.Size(220,55)
$form.Controls.Add($btnOpenAllAvito)

$chkOpen = New-Object System.Windows.Forms.CheckBox; $chkOpen.Text = "Открыть HTML"; $chkOpen.Checked = $true
$chkOpen.ForeColor = "White"; $chkOpen.Location = New-Object System.Drawing.Point(510,140)
$form.Controls.Add($chkOpen)

$log = New-Object System.Windows.Forms.TextBox
$log.Multiline = $true; $log.ScrollBars = "Vertical"
$log.Location = New-Object System.Drawing.Point(20,200); $log.Size = New-Object System.Drawing.Size(1030,600)
$log.BackColor = "#0F0F0F"; $log.ForeColor = "#00FFAA"
$log.Font = New-Object System.Drawing.Font("Consolas", 9.5)
$form.Controls.Add($log)

$global:lastFolder = ""
$global:Inventory = @()

function Log($msg) { 
    $log.AppendText("[$((Get-Date -Format 'HH:mm:ss'))] $msg`r`n")
    $log.ScrollToCaret()
}

$btnBrowse.Add_Click({ 
    $fbd = New-Object System.Windows.Forms.FolderBrowserDialog
    if ($fbd.ShowDialog() -eq "OK") { $txtPath.Text = $fbd.SelectedPath }
})

$btnGenerate.Add_Click({
    $btnGenerate.Enabled = $false
    $log.Clear()
    Log "Сканирование оборудования..."

    try {
        $OutputRoot = $txtPath.Text
        $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
        $outDir = Join-Path $OutputRoot "PC_Hardware_Report_$timestamp"
        New-Item -ItemType Directory -Path $outDir -Force | Out-Null
        $global:lastFolder = $outDir

        $region = $comboRegion.SelectedItem

        # Сбор данных
        $ErrorActionPreference = "SilentlyContinue"
        function Convert-BytesToGB { param([double]$b) if (!$b) {return ""}; [math]::Round($b/1GB,2) }

        $cs = Get-CimInstance Win32_ComputerSystem
        $mb = Get-CimInstance Win32_BaseBoard
        $cpu = Get-CimInstance Win32_Processor
        $ram = Get-CimInstance Win32_PhysicalMemory
        $gpu = Get-CimInstance Win32_VideoController
        $disks = Get-CimInstance Win32_DiskDrive

        # Инвентарь
        $global:Inventory = @()
        $global:Inventory += [pscustomobject]@{Category="Система"; Item="$($cs.Manufacturer) $($cs.Model)"; Details="Материнская плата: $($mb.Manufacturer) $($mb.Product)"; Price="15000-45000"; Search="$($cs.Manufacturer) $($cs.Model)"}
        
        foreach ($c in $cpu) { 
            $global:Inventory += [pscustomobject]@{Category="CPU"; Item=$c.Name; Details="$($c.NumberOfCores) ядер"; Price="8000-35000"; Search=$c.Name}
        }
        foreach ($r in $ram) { 
            $global:Inventory += [pscustomobject]@{Category="RAM"; Item="$($r.Manufacturer) $($r.PartNumber)"; Details="$(Convert-BytesToGB $r.Capacity) GB $($r.Speed)MHz"; Price="2500-9000"; Search="ОЗУ $($r.PartNumber)"}
        }
        foreach ($g in $gpu) { 
            $global:Inventory += [pscustomobject]@{Category="GPU"; Item=$g.Name; Details="$(Convert-BytesToGB $g.AdapterRAM) GB"; Price="15000-200000"; Search=$g.Name}
        }
        foreach ($d in $disks) { 
            $global:Inventory += [pscustomobject]@{Category="Диск"; Item=$d.Model; Details="$(Convert-BytesToGB $d.Size) GB"; Price="4000-28000"; Search=$d.Model}
        }

        # HTML
        $html = @"
<!DOCTYPE html>
<html lang="ru">
<head><meta charset="utf-8"><title>PC Hardware Report</title>
<style>
    body{font-family:Segoe UI;background:#f5f5f5}
    .card{background:white;padding:20px;margin:15px 0;border-radius:10px;box-shadow:0 2px 10px rgba(0,0,0,0.1)}
    table{width:100%;border-collapse:collapse}
    th,td{border:1px solid #ddd;padding:10px}
    th{background:#dbeafe}
</style>
</head>
<body>
<div class="card"><h1>Отчёт по ПК — $region</h1><p>Дата: $(Get-Date)</p></div>
<div class="card"><h2>Оценка стоимости + Авито</h2>
<table><tr><th>Категория</th><th>Компонент</th><th>Характеристики</th><th>Цена</th><th>Авито</th></tr>
$($global:Inventory | ForEach-Object {
    $search = [System.Web.HttpUtility]::UrlEncode($_.Search)
    "<tr><td>$($_.Category)</td><td>$($_.Item)</td><td>$($_.Details)</td><td>$($_.Price)</td><td><a href='https://www.avito.ru/all?q=$search' target='_blank'>Открыть на Авито</a></td></tr>"
} | Out-String)
</table></div></body></html>
"@

        $html | Out-File (Join-Path $outDir "hardware_report.html") -Encoding UTF8
        $global:Inventory | Export-Csv (Join-Path $outDir "Оценка_стоимости.csv") -Encoding UTF8 -NoTypeInformation

        Log "✅ Отчёт успешно создан!"
        if ($chkOpen.Checked) { Start-Process (Join-Path $outDir "hardware_report.html") }

        [System.Windows.Forms.MessageBox]::Show("Отчёт создан!`nМожно использовать кнопку 'Открыть все на Авито'", "Успех", "OK", "Information")

    } catch {
        Log "❌ Ошибка: $($_.Exception.Message)"
        [System.Windows.Forms.MessageBox]::Show("Ошибка: $($_.Exception.Message)", "Ошибка", "OK", "Error")
    } finally {
        $btnGenerate.Enabled = $true
    }
})

# Кнопка открыть всё на Авито
$btnOpenAllAvito.Add_Click({
    if ($global:Inventory.Count -eq 0) {
        [System.Windows.Forms.MessageBox]::Show("Сначала сгенерируйте отчёт!", "Внимание")
        return
    }
    Log "Открываем все компоненты на Авито..."
    foreach ($item in $global:Inventory) {
        $search = [System.Web.HttpUtility]::UrlEncode($item.Search)
        Start-Process "https://www.avito.ru/all?q=$search"
        Start-Sleep -Milliseconds 700
    }
})

Log "Программа готова. Нажмите 'Сгенерировать отчёт'."
[System.Windows.Forms.Application]::Run($form)