<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * PRC-1161 — İKİ blok:
     *   1) Referans/config blok — HER ORTAMDA çalışır; prod release paketinde de bulunur
     *      (ProductionSeeder ile aynı set). `php artisan db:seed` prod'da güvenle bunu seed eder.
     *   2) Demo/katalog fixture blok — YALNIZ local. Bu seeder DOSYALARI prod release
     *      paketine GİRMEZ (.release/package-filter); classmap-authoritative altında
     *      class_exists() false döner → sessizce atlanır, fatal YOK. Böylece shared/prod
     *      kurulumda `db:seed` ASLA demo müşteri/fatura/ticket/log üretmez.
     */
    public function run(): void
    {
        // ---- 1. Referans/config (her ortam) — sıra ProductionSeeder ile aynı ----
        // PRC-481: PermissionSeeder, AdminSeeder'dan ÖNCE (kanonik izin listesinin
        // sahibi; AdminSeeder super-admin'e tüm admin-guard izinlerini verir → izinler
        // önce var olmalı).
        $this->call([
            PermissionSeeder::class,
            AdminSeeder::class,
            CurrencySeeder::class,
            LanguageSeeder::class,
            LanguageTranslationSeeder::class,
            CountryCitySeeder::class,
            ClientGroupSeeder::class,
            ModulesSeeder::class,
            SettingsSeeder::class,
            SupportSettingsSeeder::class,
            CommunicationTemplateSeeder::class,
            TicketDepartmentSeeder::class,
            TicketDepartmentTranslationSeeder::class,
            TicketStatusSeeder::class,
            ClientBalanceTypeSeeder::class,
            // PRC-554 — locale-aware slug'lar; LanguageSeeder sonrası.
            RouteSlugSeeder::class,
            // PRC-1162 — varsayılan storefront içeriği (Ana Sayfa/Contact/FAQ/About/
            // Hosting); '/' 404 vermesin. Sahte iş verisi değil; idempotent. Pakete girer.
            StaticPagesSeeder::class,
        ]);

        // ---- 2. Demo/katalog fixture (YALNIZ local; prod pakette dosyalar YOK) ----
        // Sıra KORUNMALI — bağımlılıklar: Registrar/TLD → ClientDomain'den önce;
        // ürün katalogu → DummyClient'ten önce (factory module'ü product'tan türetir).
        if (app()->environment('local')) {
            $demo = [
                RegistrarSeeder::class,
                RegistrarSettingSeeder::class,
                TldSeeder::class,
                ClientSeeder::class,
                ProductConfigOptionGroupSeeder::class,
                ProductConfigOptionSeeder::class,
                ProductCategorySeeder::class,
                ProductSeeder::class,
                ResellerBrandSeeder::class,
                DummyClientSeeder::class,
                ClientDomainSeeder::class,
                ClientCustomFieldSeeder::class,
                ClientCustomFieldValueSeeder::class,
                ClientProductSeeder::class,
                ServerGroupSeeder::class,
                ServerSeeder::class,
                ServerGroupRelationSeeder::class,
                PricingSeeder::class,
                TicketDepartmentMailboxSeeder::class,
                EscalationRuleSeeder::class,
                TicketPredefinedReplySeeder::class,
                ServiceCostSeeder::class,
                DomainCostSeeder::class,
                ClientBalanceSeeder::class,
                CouponSeeder::class,
                TaxRuleSeeder::class,
                CancellationRequestSeeder::class,
                LogSeeder::class,
                InvoiceBillingSeeder::class,
                TicketSeeder::class,
                PaymentGatewaySeeder::class,
                TagSeeder::class,
                PostSeeder::class,
                MenuSeeder::class,
                ContractSeeder::class,
                NetworkStatusSeeder::class,
            ];

            foreach ($demo as $seeder) {
                // Prod pakette bu dosyalar yok → class_exists false → atla (fatal önle).
                if (class_exists($seeder)) {
                    $this->call($seeder);
                }
            }
        }
    }
}
