<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Referral extends Model
{
    use HasFactory;

    protected $fillable = [
        'referrer_id',
        'referred_id',
        'referral_code',
        'status',
        'points_earned',
        'total_earnings',
        'daily_earnings',
        'completed_at',
        'expires_at',
    ];

    protected $casts = [
        'points_earned' => 'integer',
        'total_earnings' => 'decimal:2',
        'daily_earnings' => 'decimal:2',
        'completed_at' => 'datetime',
        'expires_at' => 'datetime',
    ];

    /**
     * المستخدم الذي قام بالدعوة
     */
    public function referrer()
    {
        return $this->belongsTo(User::class, 'referrer_id');
    }

    /**
     * المستخدم الذي تم دعوته
     */
    public function referred()
    {
        return $this->belongsTo(User::class, 'referred_id');
    }

    /**
     * معاملات النقاط المرتبطة بهذه الإحالة
     */
    public function pointTransactions()
    {
        return $this->hasMany(PointTransaction::class);
    }

    /**
     * الأرباح المالية من هذه الإحالة
     */
    public function earnings()
    {
        return $this->hasMany(ReferralEarning::class);
    }

    /**
     * إنشاء كود دعوة فريد
     */
    public static function generateReferralCode()
    {
        do {
            $code = 'REF' . strtoupper(substr(md5(uniqid()), 0, 8));
        } while (self::where('referral_code', $code)->exists());

        return $code;
    }

    /**
     * التحقق من صحة كود الدعوة
     */
    public static function isValidReferralCode($code)
    {
        return self::where('referral_code', $code)
                   ->where('status', 'pending')
                   ->where('expires_at', '>', now())
                   ->exists();
    }

    /**
     * إكمال الإحالة
     */
    public function complete()
    {
        $this->update([
            'status' => 'completed',
            'completed_at' => now(),
        ]);

        // إضافة النقاط للمستخدم
        $this->referrer->addPoints($this->points_earned, 'referral', 'دعوة صديق', [
            'referral_id' => $this->id,
            'referred_user' => $this->referred->name,
        ]);
    }
}
