<?php

declare(strict_types=1);

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

/**
 * StatusComponentsSeeder
 *
 * Varsayılan sistem bileşenlerini oluşturur.
 * `php artisan db:seed --class=StatusComponentsSeeder` ile çalıştırılabilir.
 * Mevcut bileşenler (slug eşleşmesi) güncellenmez — sadece eksik olanlar eklenir.
 */
class StatusComponentsSeeder extends Seeder
{
    public function run(): void
    {
        $appUrl = rtrim(env('APP_URL', 'http://localhost'), '/');

        $components = [
            [
                'name' => 'Web Server (Apache)',
                'slug' => 'web-server',
                'description' => 'Ana Apache HTTP sunucusu — müşteri web sitelerini barındırır.',
                'category' => 'infrastructure',
                'check_type' => 'http',
                'endpoint' => 'http://localhost/up',
                'expected_status_code' => 200,
                'check_interval_seconds' => 60,
                'timeout_seconds' => 10,
                'display_order' => 1,
                'public' => true,
            ],
            [
                'name' => 'Veritabanı (MariaDB)',
                'slug' => 'database-mariadb',
                'description' => 'MariaDB / MySQL veritabanı sunucusu.',
                'category' => 'infrastructure',
                'check_type' => 'tcp',
                'endpoint' => 'localhost:3306',
                'expected_status_code' => 200,
                'check_interval_seconds' => 60,
                'timeout_seconds' => 5,
                'display_order' => 2,
                'public' => true,
            ],
            [
                'name' => 'Mail Sunucusu (Postfix)',
                'slug' => 'mail-postfix',
                'description' => 'SMTP gelen / giden posta sunucusu.',
                'category' => 'customer-facing',
                'check_type' => 'tcp',
                'endpoint' => 'localhost:25',
                'expected_status_code' => 200,
                'check_interval_seconds' => 120,
                'timeout_seconds' => 10,
                'display_order' => 3,
                'public' => true,
            ],
            [
                'name' => 'DNS (PowerDNS)',
                'slug' => 'dns-powerdns',
                'description' => 'Yetkili DNS sunucusu.',
                'category' => 'infrastructure',
                'check_type' => 'dns',
                'endpoint' => 'ns1.onox.com.tr',
                'expected_status_code' => 200,
                'check_interval_seconds' => 300,
                'timeout_seconds' => 10,
                'display_order' => 4,
                'public' => true,
            ],
            [
                'name' => 'Redis / Önbellek',
                'slug' => 'redis',
                'description' => 'Redis önbellek ve oturum deposu.',
                'category' => 'infrastructure',
                'check_type' => 'tcp',
                'endpoint' => 'localhost:6379',
                'expected_status_code' => 200,
                'check_interval_seconds' => 60,
                'timeout_seconds' => 5,
                'display_order' => 5,
                'public' => false,  // internal — gizle
            ],
            [
                'name' => 'API',
                'slug' => 'api',
                'description' => 'Onoxsoft REST API (v1) — müşteri otomasyon erişimi.',
                'category' => 'customer-facing',
                'check_type' => 'http',
                'endpoint' => $appUrl.'/api/v1/public/health',
                'expected_status_code' => 200,
                'check_interval_seconds' => 60,
                'timeout_seconds' => 10,
                'display_order' => 6,
                'public' => true,
            ],
            [
                'name' => 'Panel Arayüzü',
                'slug' => 'panel-ui',
                'description' => 'Onoxsoft kontrol paneli web arayüzü.',
                'category' => 'customer-facing',
                'check_type' => 'http',
                'endpoint' => $appUrl,
                'expected_status_code' => 200,
                'check_interval_seconds' => 60,
                'timeout_seconds' => 10,
                'display_order' => 7,
                'public' => true,
            ],
            [
                'name' => 'FTP Sunucusu (ProFTPD)',
                'slug' => 'ftp-proftpd',
                'description' => 'FTP / FTPS dosya transfer sunucusu.',
                'category' => 'customer-facing',
                'check_type' => 'tcp',
                'endpoint' => 'localhost:21',
                'expected_status_code' => 200,
                'check_interval_seconds' => 120,
                'timeout_seconds' => 10,
                'display_order' => 8,
                'public' => true,
            ],
        ];

        foreach ($components as $data) {
            $exists = DB::table('status_components')->where('slug', $data['slug'])->exists();

            if (! $exists) {
                DB::table('status_components')->insert(array_merge($data, [
                    'current_status' => 'operational',
                    'created_at' => now(),
                    'updated_at' => now(),
                ]));
                $this->command->line("  + {$data['name']}");
            } else {
                $this->command->line("  ~ {$data['name']} (zaten mevcut, atlandı)");
            }
        }
    }
}
