<?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
    {
        // جدول محافظ الشركاء (مطعم / مكتب غاز)
        Schema::create('partner_wallets', function (Blueprint $table) {
            $table->id();
            $table->string('owner_type', 32); // restaurant | gas_office
            $table->unsignedBigInteger('owner_id');
            $table->decimal('balance', 15, 2)->default(0.00); // الرصيد (يمكن أن يكون سالباً - ماينص)
            $table->string('currency', 10)->default('IQD');
            $table->boolean('is_active')->default(true);
            $table->timestamps();

            $table->unique(['owner_type', 'owner_id']);
            $table->index(['owner_type', 'owner_id']);
        });

        // إعدادات المحفظة (وسائل الدفع، الحد الأدنى للتعبئة، إلخ)
        Schema::create('partner_wallet_settings', function (Blueprint $table) {
            $table->id();
            $table->foreignId('partner_wallet_id')->constrained('partner_wallets')->onDelete('cascade');
            $table->json('payment_methods')->nullable(); // ["zain_cash", "mastercard"]
            $table->decimal('min_topup_amount', 15, 2)->default(1000.00);
            $table->decimal('max_topup_amount', 15, 2)->nullable();
            $table->boolean('allow_negative_balance')->default(true); // السماح بالرصيد السالب (ماينص)
            $table->text('zain_cash_merchant_id')->nullable();
            $table->text('notes')->nullable();
            $table->timestamps();

            $table->index('partner_wallet_id');
        });

        // معاملات المحفظة (تعبئة / استقطاع)
        Schema::create('partner_wallet_transactions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('partner_wallet_id')->constrained('partner_wallets')->onDelete('cascade');
            $table->string('type', 32); // topup | deduction
            $table->decimal('amount', 15, 2); // موجب دائماً، الاستقطاع يُسجّل كقيمة موجبة
            $table->decimal('balance_before', 15, 2);
            $table->decimal('balance_after', 15, 2);
            $table->string('payment_method', 64)->nullable(); // zain_cash | mastercard | null للاستقطاع
            $table->string('reference_type', 64)->nullable(); // food_order | gas_order | topup
            $table->unsignedBigInteger('reference_id')->nullable();
            $table->string('description')->nullable();
            $table->json('meta')->nullable();
            $table->string('status', 32)->default('completed'); // pending | completed | failed | refunded
            $table->string('external_id')->nullable(); // معرف الدفع الخارجي (زين كاش / بوابة الدفع)
            $table->timestamps();

            $table->index(['partner_wallet_id', 'type']);
            $table->index(['partner_wallet_id', 'created_at']);
            $table->index(['reference_type', 'reference_id']);
            $table->index('status');
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('partner_wallet_transactions');
        Schema::dropIfExists('partner_wallet_settings');
        Schema::dropIfExists('partner_wallets');
    }
};
