<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Doctor;
use App\Models\Queue;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class QueueController extends Controller
{
    // ===== (طبيب) عرض طابور اليوم =====
    public function todayQueue(Request $request): JsonResponse
    {
        $doctor = $request->user()->doctor;

        $queue = Queue::with(['patient.user'])
            ->where('doctor_id', $doctor->id)
            ->today()
            ->orderBy('position')
            ->get()
            ->map(function ($q) {
                return [
                    'id'              => $q->id,
                    'queue_number'    => $q->queue_number,
                    'position'        => $q->position,
                    'status'          => $q->status,
                    'patient_name'    => $q->is_anonymous ? 'مريض' : $q->patient->user->name,
                    'patient_id'      => $q->patient_id,
                    'arrived_at'      => $q->arrived_at?->format('H:i'),
                    'estimated_wait'  => $q->estimated_wait_minutes,
                ];
            });

        $stats = [
            'total'       => $queue->count(),
            'waiting'     => $queue->where('status', 'waiting')->count(),
            'in_progress' => $queue->where('status', 'in_progress')->count(),
            'completed'   => $queue->where('status', 'completed')->count(),
        ];

        return response()->json(['queue' => $queue, 'stats' => $stats]);
    }

    // ===== (مريض) الانضمام إلى الطابور =====
    public function joinQueue(Request $request, Doctor $doctor): JsonResponse
    {
        $patient = $request->user()->patient;

        // التحقق: هل الطبيب نشط؟
        if ($doctor->status !== 'active') {
            return response()->json(['message' => 'الطبيب غير متاح حالياً'], 422);
        }

        // التحقق: هل المريض موجود مسبقاً في الطابور؟
        $exists = Queue::where('doctor_id', $doctor->id)
            ->where('patient_id', $patient->id)
            ->today()
            ->whereIn('status', ['waiting', 'called', 'in_progress'])
            ->exists();

        if ($exists) {
            return response()->json(['message' => 'أنت مسجل بالفعل في طابور هذا الطبيب'], 422);
        }

        // التحقق: هل تجاوز الحد اليومي؟
        $todayCount = Queue::where('doctor_id', $doctor->id)->today()->count();
        if ($todayCount >= $doctor->max_daily_patients) {
            return response()->json(['message' => 'وصل الطابور إلى الحد الأقصى لهذا اليوم'], 422);
        }

        // إيجاد آخر رقم في الطابور
        $lastNumber = Queue::where('doctor_id', $doctor->id)
            ->today()
            ->max('queue_number') ?? 0;

        $waitingCount = Queue::where('doctor_id', $doctor->id)
            ->today()
            ->active()
            ->count();

        $queue = Queue::create([
            'doctor_id'              => $doctor->id,
            'patient_id'             => $patient->id,
            'queue_date'             => today(),
            'queue_number'           => $lastNumber + 1,
            'position'               => $waitingCount + 1,
            'status'                 => 'waiting',
            'arrived_at'             => now(),
            'estimated_wait_minutes' => Queue::estimateWait($doctor->id, $waitingCount + 1),
        ]);

        // إشعار الطبيب بوصول مريض جديد
        // broadcast(new PatientJoinedQueue($queue));

        return response()->json([
            'message'         => 'تم تسجيلك في الطابور بنجاح',
            'queue_number'    => $queue->queue_number,
            'position'        => $queue->position,
            'estimated_wait'  => $queue->estimated_wait_minutes . ' دقيقة',
        ], 201);
    }

    // ===== (مريض) عرض وضعه في الطابور =====
    public function myCurrentQueue(Request $request): JsonResponse
    {
        $patient = $request->user()->patient;

        $queue = Queue::with('doctor.user')
            ->where('patient_id', $patient->id)
            ->today()
            ->whereIn('status', ['waiting', 'called', 'in_progress'])
            ->first();

        if (! $queue) {
            return response()->json(['message' => 'لست في أي طابور حالياً', 'queue' => null]);
        }

        // كم شخص أمامه؟
        $ahead = Queue::where('doctor_id', $queue->doctor_id)
            ->today()
            ->waiting()
            ->where('position', '<', $queue->position)
            ->count();

        return response()->json([
            'queue' => [
                'queue_number'   => $queue->queue_number,
                'position'       => $queue->position,
                'status'         => $queue->status,
                'patients_ahead' => $ahead,
                'estimated_wait' => ($ahead * ($queue->doctor->appointment_duration ?? 15)) . ' دقيقة',
                'doctor_name'    => $queue->doctor->user->name,
                'clinic_name'    => $queue->doctor->clinic_name,
            ],
        ]);
    }

    // ===== (طبيب) استدعاء التالي =====
    public function callNext(Request $request): JsonResponse
    {
        $doctor = $request->user()->doctor;

        // إنهاء المريض الحالي أولاً
        Queue::where('doctor_id', $doctor->id)
            ->today()
            ->where('status', 'in_progress')
            ->update(['status' => 'completed', 'completed_at' => now()]);

        $next = Queue::callNext($doctor->id);

        if (! $next) {
            return response()->json(['message' => 'لا يوجد مرضى في الطابور']);
        }

        return response()->json([
            'message'      => 'تم استدعاء المريض',
            'patient_name' => $next->patient->user->name,
            'queue_number' => $next->queue_number,
        ]);
    }

    // ===== (طبيب) تحديث حالة مريض في الطابور =====
    public function updateStatus(Request $request, int $id): JsonResponse
    {
        $request->validate([
            'status' => 'required|in:called,in_progress,completed,skipped,left',
        ]);

        $doctor = $request->user()->doctor;

        $queue = Queue::where('id', $id)
            ->where('doctor_id', $doctor->id)
            ->today()
            ->firstOrFail();

        $timestamps = [
            'called'      => ['called_at' => now()],
            'in_progress' => ['started_at' => now()],
            'completed'   => ['completed_at' => now()],
        ];

        $queue->update(array_merge(
            ['status' => $request->status],
            $timestamps[$request->status] ?? []
        ));

        return response()->json(['message' => 'تم تحديث الحالة', 'queue' => $queue]);
    }

    // ===== (مريض) مغادرة الطابور =====
    public function leaveQueue(Request $request): JsonResponse
    {
        $patient = $request->user()->patient;

        $queue = Queue::where('patient_id', $patient->id)
            ->today()
            ->whereIn('status', ['waiting', 'called'])
            ->first();

        if (! $queue) {
            return response()->json(['message' => 'لست في أي طابور'], 404);
        }

        $queue->update(['status' => 'left']);

        // إعادة ترتيب الطابور
        Queue::where('doctor_id', $queue->doctor_id)
            ->today()
            ->waiting()
            ->where('position', '>', $queue->position)
            ->decrement('position');

        return response()->json(['message' => 'تم الخروج من الطابور']);
    }
}
