<?php

namespace App\Models;

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

class UserPoints extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'points',
        'available_points',
        'used_points',
    ];

    /**
     * المستخدم المالك للنقاط
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * معاملات النقاط
     */
    public function transactions()
    {
        return $this->hasMany(PointTransaction::class, 'user_id', 'user_id');
    }

    /**
     * إضافة نقاط للمستخدم
     */
    public function addPoints($points, $description = null, $source = null, $metadata = null)
    {
        $this->increment('points', $points);
        $this->increment('available_points', $points);

        // إنشاء معاملة
        PointTransaction::create([
            'user_id' => $this->user_id,
            'type' => 'earned',
            'points' => $points,
            'description' => $description ?? 'كسب نقاط',
            'source' => $source,
            'metadata' => $metadata,
        ]);
    }

    /**
     * استخدام نقاط
     */
    public function usePoints($points, $description = null, $metadata = null)
    {
        if ($this->available_points < $points) {
            throw new \Exception('نقاط غير كافية');
        }

        $this->decrement('available_points', $points);
        $this->increment('used_points', $points);

        // إنشاء معاملة
        PointTransaction::create([
            'user_id' => $this->user_id,
            'type' => 'used',
            'points' => -$points,
            'description' => $description ?? 'استخدام نقاط',
            'metadata' => $metadata,
        ]);
    }

    /**
     * الحصول على نقاط المستخدم أو إنشاؤها
     */
    public static function getOrCreateForUser($userId)
    {
        return self::firstOrCreate(
            ['user_id' => $userId],
            [
                'points' => 0,
                'available_points' => 0,
                'used_points' => 0,
            ]
        );
    }
}
