<?php

namespace App\Models;

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

class TripRequest extends Model
{
    use HasFactory;

    protected $fillable = [
        'passenger_id',
        'driver_id',
        'pickup_location',
        'pickup_location_ar',
        'pickup_lat',
        'pickup_lng',
        'destination_location',
        'destination_location_ar',
        'destination_lat',
        'destination_lng',
        'distance',
        'duration',
        'proposed_price',
        'notes',
        'status',
        'request_time',
        'expires_at',
        'accepted_at',
        'rejected_at',
        'rejection_reason',
        'wheel_milestone_pending',
        'wheel_promo_fee_amount',
        'wheel_result',
        'wheel_spun_at',
    ];

    protected $casts = [
        'pickup_lat' => 'decimal:8',
        'pickup_lng' => 'decimal:8',
        'destination_lat' => 'decimal:8',
        'destination_lng' => 'decimal:8',
        'distance' => 'decimal:2',
        'duration' => 'integer',
        'proposed_price' => 'decimal:2',
        'request_time' => 'datetime',
        'expires_at' => 'datetime',
        'accepted_at' => 'datetime',
        'rejected_at' => 'datetime',
        'wheel_milestone_pending' => 'boolean',
        'wheel_promo_fee_amount' => 'decimal:2',
        'wheel_result' => 'integer',
        'wheel_spun_at' => 'datetime',
    ];

    /**
     * علاقة مع الراكب
     */
    public function passenger(): BelongsTo
    {
        return $this->belongsTo(User::class, 'passenger_id');
    }

    /**
     * علاقة مع السائق
     */
    public function driver(): BelongsTo
    {
        return $this->belongsTo(User::class, 'driver_id');
    }

    /**
     * نطاق للطلبات المعلقة
     */
    public function scopePending($query)
    {
        return $query->where('status', 'pending');
    }

    /**
     * نطاق للطلبات المقبولة
     */
    public function scopeAccepted($query)
    {
        return $query->where('status', 'accepted');
    }

    /**
     * نطاق للطلبات المرفوضة
     */
    public function scopeRejected($query)
    {
        return $query->where('status', 'rejected');
    }

    /**
     * نطاق للطلبات المنتهية الصلاحية
     */
    public function scopeExpired($query)
    {
        return $query->where('status', 'expired');
    }

    /**
     * نطاق للطلبات حسب السائق
     */
    public function scopeByDriver($query, $driverId)
    {
        return $query->where('driver_id', $driverId);
    }

    /**
     * نطاق للطلبات حسب الراكب
     */
    public function scopeByPassenger($query, $passengerId)
    {
        return $query->where('passenger_id', $passengerId);
    }

    /**
     * نطاق للطلبات حسب المنطقة
     */
    public function scopeByArea($query, $lat, $lng, $radius = 5)
    {
        // حساب المسافة باستخدام صيغة Haversine
        $haversine = "(6371 * acos(cos(radians($lat)) * cos(radians(pickup_lat)) * cos(radians(pickup_lng) - radians($lng)) + sin(radians($lat)) * sin(radians(pickup_lat))))";
        
        return $query->whereRaw("$haversine <= ?", [$radius]);
    }

    /**
     * الحصول على حالة الطلب بالعربية
     */
    public function getStatusArabicAttribute(): string
    {
        return match($this->status) {
            'pending' => 'معلق',
            'accepted' => 'مقبول',
            'rejected' => 'مرفوض',
            'expired' => 'منتهي الصلاحية',
            default => 'غير معروف',
        };
    }

    /**
     * الحصول على لون الحالة
     */
    public function getStatusColorAttribute(): string
    {
        return match($this->status) {
            'pending' => 'orange',
            'accepted' => 'blue',
            'rejected' => 'red',
            'expired' => 'grey',
            default => 'grey',
        };
    }
}
