<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        // جدول الإحالات
        Schema::create('referrals', function (Blueprint $table) {
            $table->id();
            $table->foreignId('referrer_id')->constrained('users')->onDelete('cascade'); // من دعا
            $table->foreignId('referred_id')->nullable()->constrained('users')->onDelete('cascade'); // من تم دعوته
            $table->string('referral_code')->unique(); // كود الدعوة
            $table->enum('status', ['pending', 'completed', 'expired'])->default('pending');
            $table->integer('points_earned')->default(0); // النقاط المكتسبة
            $table->timestamp('completed_at')->nullable();
            $table->timestamp('expires_at')->nullable();
            $table->timestamps();
            
            $table->index(['referrer_id', 'status']);
            $table->index(['referred_id']);
            $table->index(['referral_code']);
        });

        // جدول النقاط
        Schema::create('user_points', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users')->onDelete('cascade');
            $table->integer('points')->default(0); // إجمالي النقاط
            $table->integer('available_points')->default(0); // النقاط المتاحة للاستخدام
            $table->integer('used_points')->default(0); // النقاط المستخدمة
            $table->timestamps();
            
            $table->unique('user_id');
        });

        // جدول معاملات النقاط
        Schema::create('point_transactions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users')->onDelete('cascade');
            $table->enum('type', ['earned', 'used', 'expired', 'refunded']); // نوع المعاملة
            $table->integer('points'); // عدد النقاط (موجب للكسب، سالب للاستخدام)
            $table->string('description'); // وصف المعاملة
            $table->string('source')->nullable(); // مصدر النقاط (referral, purchase, etc.)
            $table->foreignId('referral_id')->nullable()->constrained('referrals')->onDelete('set null');
            $table->json('metadata')->nullable(); // بيانات إضافية
            $table->timestamps();
            
            $table->index(['user_id', 'type']);
            $table->index(['created_at']);
        });

        // جدول المكافآت
        Schema::create('point_rewards', function (Blueprint $table) {
            $table->id();
            $table->string('name'); // اسم المكافأة
            $table->string('name_ar'); // اسم المكافأة بالعربية
            $table->text('description')->nullable();
            $table->text('description_ar')->nullable();
            $table->enum('type', ['discount', 'cash', 'free_service', 'product']); // نوع المكافأة
            $table->integer('points_required'); // النقاط المطلوبة
            $table->decimal('value', 10, 2)->nullable(); // قيمة المكافأة
            $table->string('currency', 3)->default('IQD'); // العملة
            $table->boolean('is_active')->default(true);
            $table->integer('max_redemptions')->nullable(); // الحد الأقصى للاسترداد
            $table->integer('current_redemptions')->default(0); // الاستردادات الحالية
            $table->timestamp('valid_from')->nullable();
            $table->timestamp('valid_until')->nullable();
            $table->timestamps();
        });

        // جدول استرداد المكافآت
        Schema::create('point_redemptions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users')->onDelete('cascade');
            $table->foreignId('reward_id')->constrained('point_rewards')->onDelete('cascade');
            $table->integer('points_used'); // النقاط المستخدمة
            $table->enum('status', ['pending', 'approved', 'rejected', 'completed'])->default('pending');
            $table->string('redemption_code')->unique(); // كود الاسترداد
            $table->text('notes')->nullable(); // ملاحظات
            $table->timestamp('approved_at')->nullable();
            $table->timestamp('completed_at')->nullable();
            $table->timestamps();
            
            $table->index(['user_id', 'status']);
            $table->index(['redemption_code']);
        });

        // جدول إعدادات النقاط
        Schema::create('point_settings', function (Blueprint $table) {
            $table->id();
            $table->string('key')->unique(); // مفتاح الإعداد
            $table->text('value'); // قيمة الإعداد
            $table->text('description')->nullable(); // وصف الإعداد
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('point_redemptions');
        Schema::dropIfExists('point_rewards');
        Schema::dropIfExists('point_transactions');
        Schema::dropIfExists('user_points');
        Schema::dropIfExists('referrals');
        Schema::dropIfExists('point_settings');
    }
};
