<?php

namespace App\Models;

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

class Trip extends Model
{
    use HasFactory;

    protected $fillable = [
        'driver_id',
        'passenger_id',
        'vehicle_id',
        'request_id',
        'pickup_location',
        'dropoff_location',
        'pickup_latitude',
        'pickup_longitude',
        'dropoff_latitude',
        'dropoff_longitude',
        'distance',
        'fare',
        'status',
        'pickup_time',
        'dropoff_time',
        'notes',
        'driver_rating',
        'passenger_rating',
    ];

    protected $casts = [
        'pickup_latitude' => 'decimal:8',
        'pickup_longitude' => 'decimal:8',
        'dropoff_latitude' => 'decimal:8',
        'dropoff_longitude' => 'decimal:8',
        'distance' => 'decimal:2',
        'fare' => 'decimal:2',
        'pickup_time' => 'datetime',
        'dropoff_time' => 'datetime',
        'driver_rating' => 'decimal:2',
        'passenger_rating' => 'decimal:2',
    ];

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

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

    /**
     * علاقة مع طلب الرحلة
     */
    public function tripRequest(): BelongsTo
    {
        return $this->belongsTo(TripRequest::class, 'request_id');
    }

    /**
     * علاقة مع المركبة
     */
    public function vehicle(): BelongsTo
    {
        return $this->belongsTo(Vehicle::class);
    }

    /**
     * علاقة مع الدفع
     */
    public function payment(): HasOne
    {
        return $this->hasOne(Payment::class);
    }

    /**
     * نطاق للرحلات النشطة
     */
    public function scopeActive($query)
    {
        return $query->where('status', 'active');
    }

    /**
     * نطاق للرحلات المكتملة
     */
    public function scopeCompleted($query)
    {
        return $query->where('status', 'completed');
    }

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

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

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

    /**
     * نطاق للرحلات حسب الفترة
     */
    public function scopeByPeriod($query, $period)
    {
        return match($period) {
            'today' => $query->whereDate('created_at', today()),
            'week' => $query->whereBetween('created_at', [now()->startOfWeek(), now()->endOfWeek()]),
            'month' => $query->whereMonth('created_at', now()->month),
            'year' => $query->whereYear('created_at', now()->year),
            default => $query,
        };
    }

    /**
     * الحصول على حالة الرحلة بالعربية
     */
    public function getStatusArabicAttribute(): string
    {
        return match($this->status) {
            'active' => 'نشطة',
            'completed' => 'مكتملة',
            'cancelled' => 'ملغية',
            default => 'غير معروف',
        };
    }

    /**
     * الحصول على لون الحالة
     */
    public function getStatusColorAttribute(): string
    {
        return match($this->status) {
            'active' => 'blue',
            'completed' => 'green',
            'cancelled' => 'red',
            default => 'grey',
        };
    }

    /**
     * الحصول على المدة المتبقية (للرحلات النشطة)
     */
    public function getRemainingTimeAttribute(): ?string
    {
        if ($this->status !== 'active' || !$this->start_time) {
            return null;
        }

        $elapsed = now()->diffInMinutes($this->start_time);
        $remaining = max(0, $this->duration - $elapsed);
        
        return $remaining > 0 ? "{$remaining} دقيقة" : "انتهت";
    }

    /**
     * الحصول على إجمالي الأرباح (للرحلات المكتملة)
     */
    public function getTotalEarningsAttribute(): float
    {
        if ($this->status === 'completed') {
            return (float) $this->final_price;
        }
        return 0;
    }
}
