<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
     public function up(): void
     {
          // ─── 1. Alan Tanımları (Acente Şablonu) ───────────────────────────────
          // Her acente kendi özel alan şemalarını buraya kaydeder.
          // Örn: "Çocuk Sayısı", "Kan Grubu", "Vize Durumu"
          Schema::create('customer_field_definitions', function (Blueprint $table) {
               $table->id();

               // Hangi acentenin alanı
               $table->unsignedBigInteger('agency_id');

               // Teknik anahtar (otomatik slug'dan üretilir, sorgularda kullanılır)
               $table->string('field_key', 60);         // child_count, blood_type, visa_status

               // Görünen etiket
               $table->string('label', 120);            // Çocuk Sayısı, Kan Grubu

               // Alan tipi
               $table->enum('field_type', [
                    'text',      // Kısa metin
                    'textarea',  // Uzun metin
                    'number',    // Sayı
                    'decimal',   // Ondalık sayı
                    'boolean',   // Evet/Hayır
                    'date',      // Tarih
                    'select',    // Açılır liste
                    'multiselect', // Çoklu seçim
                    'email',     // E-posta
                    'phone',     // Telefon
                    'url',       // URL
               ])->default('text');

               // select / multiselect için seçenek listesi
               // [{"value":"O+","label":"O RH+"},{"value":"A+","label":"A RH+"}]
               $table->json('options')->nullable();

               // Doğrulama kuralları
               $table->string('validation_rules')->nullable(); // min:0|max:20 vb.
               $table->string('default_value')->nullable();

               // Davranış
               $table->boolean('is_required')->default(false);
               $table->boolean('is_searchable')->default(false); // Liste sayfasında arama
               $table->boolean('is_filterable')->default(false); // Liste sayfasında filtre
               $table->boolean('is_visible_in_list')->default(false); // Tablo kolonunda göster
               $table->boolean('is_active')->default(true);

               // Yardım metni (form altındaki açıklama)
               $table->string('help_text')->nullable();

               // Sıralama
               $table->unsignedSmallInteger('sort_order')->default(0);

               // Audit
               $table->unsignedBigInteger('created_by')->nullable();
               $table->unsignedBigInteger('updated_by')->nullable();
               $table->timestamps();
               $table->softDeletes();

               // Foreign Keys
               $table->foreign('agency_id')->references('id')->on('agencies')->onDelete('cascade');
               $table->foreign('created_by')->references('id')->on('users')->onDelete('set null');
               $table->foreign('updated_by')->references('id')->on('users')->onDelete('set null');

               // Aynı acente içinde aynı key tekrar edemez
               $table->unique(['agency_id', 'field_key']);

               // Indexes
               $table->index(['agency_id', 'is_active', 'sort_order']);
               $table->index(['agency_id', 'is_filterable']);
               $table->index(['agency_id', 'is_searchable']);
          });

          // ─── 2. Alan Değerleri (Müşteri Başına) ───────────────────────────────
          // Her müşterinin her alan tanımı için sakladığı gerçek değer.
          Schema::create('customer_field_values', function (Blueprint $table) {
               $table->id();

               $table->unsignedBigInteger('customer_id');
               $table->unsignedBigInteger('field_definition_id');

               // Tüm değerler text olarak saklanır; model katmanında tip dönüşümü yapılır.
               $table->text('value')->nullable();

               $table->timestamps();

               // Foreign Keys
               $table->foreign('customer_id')
                    ->references('id')->on('customers')->onDelete('cascade');
               $table->foreign('field_definition_id')
                    ->references('id')->on('customer_field_definitions')->onDelete('cascade');

               // Her müşteri için her alan sadece bir değer tutabilir
               $table->unique(['customer_id', 'field_definition_id']);

               // Indexes
               $table->index(['customer_id']);
               $table->index(['field_definition_id']);
          });
     }

     public function down(): void
     {
          Schema::dropIfExists('customer_field_values');
          Schema::dropIfExists('customer_field_definitions');
     }
};
