<?php

namespace Database\Seeders;

use App\Models\AffiliateProductOverride;
use App\Models\Contract;
use App\Models\Product;
use App\Models\ProductCategory;
use App\Models\ProductConfigOption;
use App\Models\ProductConfigOptionGroup;
use App\Models\ProductCustomField;
use App\Models\ProductGroup;
use App\Models\ProductUpgradePath;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class ProductSeeder extends Seeder
{
    public function run(): void
    {
        // QA fixtures (PRC-532/536/541): 3 grup + 7 ürün + TR/EN çeviri + contract/
        // affiliate/upgrade + trial varyantları. Pricing PricingSeeder'da.
        // Idempotent: ürün forceDelete'i product_contracts / affiliate_product_overrides
        // / product_upgrade_paths satırlarını FK-cascade ile siler; language_translations
        // (Product_* scope) FK'sız olduğundan ayrıca temizlenir.
        DB::table('product_config_option_relations')->delete();
        DB::table('language_translations')->where('scope_identifier', 'like', 'Product\_%')->delete();
        Product::query()->forceDelete();
        ProductGroup::query()->forceDelete();

        // --- Gruplar ---
        // PRC-565 — group icon değerleri (PRC-560 schema drift fix sonrası icon kolonu eklendi)
        $groupDefs = [
            ['name' => 'QA Hosting', 'slug' => 'qa-hosting', 'icon' => 'fas fa-server'],
            ['name' => 'QA Sunucu',  'slug' => 'qa-sunucu',  'icon' => 'fas fa-cloud'],
            ['name' => 'QA Diğer',   'slug' => 'qa-diger',   'icon' => 'fas fa-box'],
        ];
        $groups = [];
        $gOrder = 1;
        foreach ($groupDefs as $g) {
            $groups[$g['name']] = ProductGroup::create([
                'name'   => $g['name'],
                'slug'   => $g['slug'],
                'icon'   => $g['icon'],
                'hidden' => false,
                'order'  => $gOrder++,
            ]);
        }

        $categories = ProductCategory::pluck('id', 'name');

        // --- Ürünler ---
        // QA fixture matrisi: trial × (contract / affiliate / upgrade) kombinasyonlarını
        // kapsar; description çevirileri her ürünün hangi özelliklere sahip olduğunu
        // çok dilli açıklar.
        //
        //  Ürün     | trial          | contract | upgrade               | affiliate
        //  ---------+----------------+----------+-----------------------+----------
        //  qa-basic | free 14g       | —        | BASIC↔PRO             | %20
        //  qa-pro   | paid %20       | SLA      | BASIC↔PRO, PRO↔CLOUD | %15
        //  qa-cloud | free 7g card   | SLA      | PRO↔CLOUD             | —
        //  qa-free  | yok            | —        | —                     | — (0-fiyatlı sabit fixture)
        //  qa-ssl   | paid %15       | AUP      | —                     | %10
        //  qa-soft  | paid %25       | —        | —                     | —
        //  qa-gap   | yok            | —        | —                     | — (baseline / currency-gap fixture)
        $productDefs = [
            [
                'slug' => 'qa-basic', 'type' => 'hosting', 'group' => 'QA Hosting',
                'module' => 'dummyproduct', 'require_domain' => false,
                'trial_mode' => 'free', 'trial_period_days' => 14, 'trial_ccsave' => false,
                'trial_paid_discount_percent' => null, 'trial_default_period' => 'monthly',
                'upgrades_enabled' => true, 'affiliate_enabled' => true,
                // PRC-812 — free trial suistimal örneği: müşteri başına 1 sipariş +
                // yenileme kapalı (free→paid upgrade zorlanır).
                'max_orders_per_client' => 1, 'allow_renewal' => false,
                'name' => ['en' => 'QA Basic', 'tr' => 'QA Temel'],
                'desc' => [
                    'en' => 'QA Basic — hosting test product. Features: 14-day free trial, upgrade paths, 20% affiliate commission.',
                    'tr' => 'QA Temel — hosting test ürünü. Özellikler: 14 günlük ücretsiz deneme, upgrade yolları, %20 affiliate komisyonu.',
                ],
            ],
            [
                'slug' => 'qa-pro', 'type' => 'hosting', 'group' => 'QA Hosting',
                'module' => 'dummyproduct', 'require_domain' => true,
                'trial_mode' => 'paid', 'trial_period_days' => null, 'trial_ccsave' => false,
                'trial_paid_discount_percent' => 20.00, 'trial_default_period' => null,
                'upgrades_enabled' => true, 'affiliate_enabled' => true,
                'name' => ['en' => 'QA Pro', 'tr' => 'QA Pro'],
                'desc' => [
                    'en' => 'QA Pro — hosting test product. Features: paid trial (20% off first period), SLA contract (required at checkout), upgrade paths, 15% affiliate commission, configurable options (RAM/Disk/Backup).',
                    'tr' => 'QA Pro — hosting test ürünü. Özellikler: paid trial (ilk dönem %20 indirim), SLA sözleşmesi (ödemede zorunlu), upgrade yolları, %15 affiliate komisyonu, yapılandırma seçenekleri (RAM/Disk/Yedekleme).',
                ],
            ],
            [
                'slug' => 'qa-cloud', 'type' => 'server', 'group' => 'QA Sunucu',
                'module' => 'dummyvm', 'require_domain' => false,
                'trial_mode' => 'free', 'trial_period_days' => 7, 'trial_ccsave' => true,
                'trial_paid_discount_percent' => null, 'trial_default_period' => 'monthly',
                'upgrades_enabled' => true, 'affiliate_enabled' => false,
                'name' => ['en' => 'QA Cloud', 'tr' => 'QA Bulut'],
                'desc' => [
                    'en' => 'QA Cloud — server test product. Features: 7-day free trial (card saved at signup), SLA contract (required at checkout), upgrade paths, required configuration (vCPU).',
                    'tr' => 'QA Bulut — sunucu test ürünü. Özellikler: 7 günlük ücretsiz deneme (signup\'ta kart kaydedilir), SLA sözleşmesi (ödemede zorunlu), upgrade yolları, zorunlu yapılandırma (vCPU).',
                ],
            ],
            [
                'slug' => 'qa-free', 'type' => 'hosting', 'group' => 'QA Hosting',
                'module' => 'dummyproduct', 'require_domain' => false,
                'trial_mode' => 'none', 'trial_period_days' => null, 'trial_ccsave' => false,
                'trial_paid_discount_percent' => null, 'trial_default_period' => null,
                'upgrades_enabled' => false, 'affiliate_enabled' => false,
                // PRC-812 — ücretsiz paket suistimal örneği: müşteri başına 1 sipariş.
                'max_orders_per_client' => 1, 'allow_renewal' => true,
                'name' => ['en' => 'QA Free', 'tr' => 'QA Ücretsiz'],
                'desc' => [
                    'en' => 'QA Free — 0-priced fixture (deliberately free hosting, not a trial). No additional features.',
                    'tr' => 'QA Ücretsiz — 0-fiyatlı fixture (kasıtlı ücretsiz hosting, trial değil). Ek özellik yok.',
                ],
            ],
            [
                // PRC-558 — SSL ürünü her zaman domain'e bağlıdır (Common Name).
                // require_domain=false provisioning fail eder (AbstractSsl line 235).
                'slug' => 'qa-ssl', 'type' => 'ssl', 'group' => 'QA Diğer',
                'module' => 'dummyssl', 'require_domain' => true,
                'trial_mode' => 'paid', 'trial_period_days' => null, 'trial_ccsave' => false,
                'trial_paid_discount_percent' => 15.00, 'trial_default_period' => null,
                // PRC-544 — paid trial sadece monthly + annually'de uygulanır (2/3 yıllıkta normal fiyat).
                'trial_paid_discount_periods' => [1, 12],
                'upgrades_enabled' => false, 'affiliate_enabled' => true,
                'name' => ['en' => 'QA SSL', 'tr' => 'QA SSL'],
                'desc' => [
                    'en' => 'QA SSL — SSL certificate test product. Features: paid trial (15% off monthly + annually only), AUP contract (required at checkout), 10% affiliate commission.',
                    'tr' => 'QA SSL — SSL sertifikası test ürünü. Özellikler: paid trial (sadece aylık + yıllıkta %15 indirim), AUP sözleşmesi (ödemede zorunlu), %10 affiliate komisyonu.',
                ],
            ],
            [
                'slug' => 'qa-soft', 'type' => 'software', 'group' => 'QA Diğer',
                'module' => 'generic', 'require_domain' => false,
                'trial_mode' => 'paid', 'trial_period_days' => null, 'trial_ccsave' => false,
                'trial_paid_discount_percent' => 25.00, 'trial_default_period' => null,
                // PRC-544 — null = geri-uyumlu (tüm periyotlarda %25 uygulanır).
                'trial_paid_discount_periods' => null,
                'upgrades_enabled' => false, 'affiliate_enabled' => false,
                'name' => ['en' => 'QA Software', 'tr' => 'QA Yazılım'],
                'desc' => [
                    'en' => 'QA Software — software license test product. Features: paid trial (25% off first period, all periods), one-time setup fee.',
                    'tr' => 'QA Yazılım — yazılım lisansı test ürünü. Özellikler: paid trial (ilk dönem %25 indirim, tüm periyotlar), tek seferlik kurulum ücreti.',
                ],
            ],
            [
                'slug' => 'qa-gap', 'type' => 'hosting', 'group' => 'QA Hosting',
                'module' => 'dummyproduct', 'require_domain' => false,
                'trial_mode' => 'none', 'trial_period_days' => null, 'trial_ccsave' => false,
                'trial_paid_discount_percent' => null, 'trial_default_period' => null,
                'upgrades_enabled' => false, 'affiliate_enabled' => false,
                'name' => ['en' => 'QA Gap', 'tr' => 'QA Gap'],
                'desc' => [
                    'en' => 'QA Gap — hosting test product with deliberate currency price gaps (priced in TRY only). Baseline / no features.',
                    'tr' => 'QA Gap — kasıtlı para birimi fiyat boşlukları olan hosting test ürünü (yalnız TRY). Baseline / özellik yok.',
                ],
            ],
        ];

        /** @var array<string,Product> $created */
        $created = [];
        $pOrder = 0; // PRC-565 — deterministik ürün sıralaması (A2 senaryosu için NULL fallback'ten kaçın)
        foreach ($productDefs as $p) {
            $pOrder += 10;
            $product = Product::create([
                'category_id'                 => $categories[$p['group']] ?? null,
                'group_id'                    => $groups[$p['group']]->id,
                'type'                        => $p['type'],
                'slug'                        => $p['slug'],
                'name'                        => $p['name']['en'],
                'description'                 => $p['desc']['en'],
                'hidden'                      => false,
                'status'                      => 'active',
                'order'                       => $pOrder,
                'require_domain'              => $p['require_domain'],
                'module'                      => $p['module'],
                // PRC-812 — free/trial suistimal kontrolleri (key yoksa varsayılan:
                // sınırsız sipariş + yenileme açık = mevcut davranış).
                'max_orders_per_client'       => $p['max_orders_per_client'] ?? null,
                'allow_renewal'               => $p['allow_renewal'] ?? true,
                'payment_type'                => 'recurring',
                'auto_setup_option'           => 'payment',
                // PRC-863 — güvenli lifecycle default'ları (null bırakılırsa hiç askıya alınmaz)
                'auto_suspension_days'        => 14,
                'auto_termination_days'       => 30,
                'trial_mode'                  => $p['trial_mode'],
                'trial_period_days'           => $p['trial_period_days'],
                'trial_ccsave'                => $p['trial_ccsave'],
                'trial_paid_discount_percent' => $p['trial_paid_discount_percent'],
                // PRC-544 — key set olmayan ürünler için NULL = tüm periyotlar (geri-uyumlu).
                'trial_paid_discount_periods' => $p['trial_paid_discount_periods'] ?? null,
                'trial_default_period'        => $p['trial_default_period'],
                'upgrades_enabled'            => $p['upgrades_enabled'],
                'affiliate_enabled'           => $p['affiliate_enabled'],
            ]);

            // TR/EN çeviriler (name + description) — language_translations.
            $product->setTranslation('name', 'en', $p['name']['en']);
            $product->setTranslation('name', 'tr', $p['name']['tr']);
            $product->setTranslation('description', 'en', $p['desc']['en']);
            $product->setTranslation('description', 'tr', $p['desc']['tr']);

            $created[$p['slug']] = $product;
        }

        // --- Config opsiyon bağlama (product_config_option_relations) ---
        $options = ProductConfigOption::pluck('id', 'name');
        $configGroupId = ProductConfigOptionGroup::where('name', 'QA Yapılandırma')->value('id');

        foreach (['RAM', 'Disk', 'Yedekleme', 'vCPU'] as $expectedOption) {
            if (! isset($options[$expectedOption])) {
                throw new \RuntimeException("ProductSeeder: config opsiyonu bulunamadı — {$expectedOption} (ProductConfigOptionSeeder çalıştı mı?)");
            }
        }

        if ($configGroupId === null) {
            throw new \RuntimeException('ProductSeeder: "QA Yapılandırma" config grubu bulunamadı (ProductConfigOptionGroupSeeder çalıştı mı?)');
        }

        // QA-PRO ← RAM + Disk + Yedekleme (hepsi opsiyonel)
        foreach (['RAM', 'Disk', 'Yedekleme'] as $optName) {
            $created['qa-pro']->options()->attach($options[$optName], ['group_id' => $configGroupId]);
        }
        // QA-CLOUD ← vCPU (zorunlu) + RAM (opsiyonel)
        foreach (['vCPU', 'RAM'] as $optName) {
            $created['qa-cloud']->options()->attach($options[$optName], ['group_id' => $configGroupId]);
        }

        // --- Sözleşmeler — QA SLA + QA AUP (firstOrCreate; product_contracts pivot) ---
        $sla = Contract::firstOrCreate(
            ['slug' => 'qa-sla'],
            [
                'title' => 'QA Service Level Agreement',
                'content' => '<p>QA test SLA — uptime garantisi ve destek yanıt süresi yer tutucusu.</p>',
                'type' => 'sla',
                'status' => 'active',
                'version' => '1.0',
                'requires_acceptance' => true,
                'sort_order' => 100,
                'effective_date' => now(),
            ],
        );
        $sla->setTranslation('title', 'en', 'QA Service Level Agreement');
        $sla->setTranslation('title', 'tr', 'QA Hizmet Düzeyi Anlaşması');

        $aup = Contract::firstOrCreate(
            ['slug' => 'qa-aup'],
            [
                'title' => 'QA Acceptable Use Policy',
                'content' => '<p>QA test AUP — kabul edilebilir kullanım kuralları yer tutucusu.</p>',
                'type' => 'aup',
                'status' => 'active',
                'version' => '1.0',
                'requires_acceptance' => true,
                'sort_order' => 101,
                'effective_date' => now(),
            ],
        );
        $aup->setTranslation('title', 'en', 'QA Acceptable Use Policy');
        $aup->setTranslation('title', 'tr', 'QA Kabul Edilebilir Kullanım Politikası');

        $created['qa-pro']->contracts()->attach($sla->id, ['required' => true]);
        $created['qa-cloud']->contracts()->attach($sla->id, ['required' => true]);
        $created['qa-ssl']->contracts()->attach($aup->id, ['required' => true]);

        // --- Affiliate komisyon override'ları (affiliate_product_overrides) ---
        $affiliateRates = ['qa-basic' => 20.00, 'qa-pro' => 15.00, 'qa-ssl' => 10.00];
        foreach ($affiliateRates as $slug => $rate) {
            AffiliateProductOverride::create([
                'product_id' => $created[$slug]->id,
                'commission_rate' => $rate,
                'enabled' => true,
            ]);
        }

        // --- Upgrade yolları (product_upgrade_paths — yön runtime'da belirlenir) ---
        ProductUpgradePath::create([
            'source_product_id' => $created['qa-basic']->id,
            'target_product_id' => $created['qa-pro']->id,
        ]);
        ProductUpgradePath::create([
            'source_product_id' => $created['qa-pro']->id,
            'target_product_id' => $created['qa-cloud']->id,
        ]);

        // --- Custom fields (PRC-565 — A7 senaryosu) ---
        // QA Pro'ya 2 custom field: 1 required text + 1 optional dropdown.
        // Label/placeholder çevirileri language_translations'a yazılır.
        $qaPro = $created['qa-pro'];

        $cfHostname = ProductCustomField::create([
            'product_id'            => $qaPro->id,
            'type'                  => 'text',
            'admin_only'            => false,
            'visible_on_client'     => true,
            'required_from_client'  => true,
            'visible_on_invoice'    => true,
            'order'                 => 1,
            'status'                => true,
        ]);
        $cfHostname->setTranslation('label', 'en', 'Server Hostname');
        $cfHostname->setTranslation('label', 'tr', 'Sunucu Adı');
        $cfHostname->setTranslation('placeholder', 'en', 'e.g. web-01.example.com');
        $cfHostname->setTranslation('placeholder', 'tr', 'örn. web-01.example.com');

        $cfOS = ProductCustomField::create([
            'product_id'            => $qaPro->id,
            'type'                  => 'dropdown',
            'dropdown_options'      => ['linux', 'windows', 'freebsd'],
            'default_value'         => 'linux', // PRC-786 — dropdown ön-seçili
            'admin_only'            => false,
            'visible_on_client'     => true,
            'required_from_client'  => false,
            'visible_on_invoice'    => true,
            'order'                 => 2,
            'status'                => true,
        ]);
        $cfOS->setTranslation('label', 'en', 'Operating System');
        $cfOS->setTranslation('label', 'tr', 'İşletim Sistemi');

        // PRC-786 — flagship senaryo: checkbox varsayılan işaretli (Public IP);
        // ayrıca "checkbox artık gerçek checkbox olarak render ediliyor" fix'ini test eder.
        $cfPublicIp = ProductCustomField::create([
            'product_id'            => $qaPro->id,
            'type'                  => 'checkbox',
            'default_value'         => '1',
            'admin_only'            => false,
            'visible_on_client'     => true,
            'required_from_client'  => false,
            'visible_on_invoice'    => true,
            'order'                 => 3,
            'status'                => true,
        ]);
        $cfPublicIp->setTranslation('label', 'en', 'Assign Public IP');
        $cfPublicIp->setTranslation('label', 'tr', 'Genel IP Ata');
    }
}
