<?php

namespace App\Models;

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

class TaxiRequest extends Model
{
    use HasFactory;

    protected $fillable = [
        'passenger_id',
        'passenger_name',
        'passenger_phone',
        'driver_id',
        'driver_name',
        'driver_phone',
        'from_latitude',
        'from_longitude',
        'from_address',
        'to_latitude',
        'to_longitude',
        'to_address',
        'price',
        'notes',
        'status',
        'estimated_duration',
        'estimated_distance',
        'accepted_at',
        'completed_at',
        'cancelled_at',
        'wheel_milestone_pending',
        'wheel_promo_fee_amount',
        'wheel_result',
        'wheel_spun_at',
    ];

    protected $casts = [
        'from_latitude' => 'decimal:8',
        'from_longitude' => 'decimal:8',
        'to_latitude' => 'decimal:8',
        'to_longitude' => 'decimal:8',
        'price' => 'decimal:2',
        'estimated_duration' => 'integer',
        'estimated_distance' => 'decimal:2',
        'accepted_at' => 'datetime',
        'completed_at' => 'datetime',
        'cancelled_at' => 'datetime',
        'wheel_milestone_pending' => 'boolean',
        'wheel_promo_fee_amount' => 'decimal:2',
        'wheel_result' => 'integer',
        'wheel_spun_at' => 'datetime',
    ];

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

    /**
     * العلاقة مع السائق
     */
    public function driver()
    {
        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 scopeCompleted($query)
    {
        return $query->where('status', 'completed');
    }

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

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

    /**
     * نطاق للطلبات في نطاق جغرافي
     */
    public function scopeByArea($query, $lat, $lng, $radius = 5)
    {
        return $query->whereRaw("
            (6371 * acos(cos(radians(?)) * cos(radians(from_latitude)) * 
            cos(radians(from_longitude) - radians(?)) + 
            sin(radians(?)) * sin(radians(from_latitude)))) <= ?
        ", [$lat, $lng, $lat, $radius]);
    }

    /**
     * الحصول على حالة الطلب بالعربية
     */
    public function getStatusArabicAttribute()
    {
        $statuses = [
            'pending' => 'في الانتظار',
            'accepted' => 'مقبول',
            'in_progress' => 'قيد التنفيذ',
            'completed' => 'مكتمل',
            'cancelled' => 'ملغي',
            'rejected' => 'مرفوض',
        ];

        return $statuses[$this->status] ?? 'غير محدد';
    }

    /**
     * الحصول على لون حالة الطلب
     */
    public function getStatusColorAttribute()
    {
        $colors = [
            'pending' => '#FFA500',      // برتقالي
            'accepted' => '#28A745',     // أخضر
            'in_progress' => '#007BFF',  // أزرق
            'completed' => '#6C757D',    // رمادي
            'cancelled' => '#DC3545',    // أحمر
            'rejected' => '#DC3545',     // أحمر
        ];

        return $colors[$this->status] ?? '#6C757D';
    }

    /**
     * التحقق من إمكانية إلغاء الطلب
     */
    public function canBeCancelled()
    {
        return in_array($this->status, ['pending', 'accepted']);
    }

    /**
     * التحقق من إمكانية قبول الطلب
     */
    public function canBeAccepted()
    {
        return $this->status === 'pending';
    }

    /**
     * التحقق من إمكانية رفض الطلب
     */
    public function canBeRejected()
    {
        return $this->status === 'pending';
    }

    /**
     * التحقق من إمكانية إكمال الطلب
     */
    public function canBeCompleted()
    {
        return $this->status === 'accepted';
    }
}
