<?php

namespace App\Console\Commands;

use App\Models\Booking;
use App\Services\BookingNotificationService;
use Illuminate\Console\Command;

class ManageConsultations extends Command
{
    protected $signature = 'bookings:manage-consultations';

    protected $description = 'Warn participants at five minutes remaining and close consultations after 30 minutes';

    public function handle(BookingNotificationService $notifications): int
    {
        Booking::query()
            ->whereNotNull('consultation_started_at')
            ->whereNull('consultation_closed_at')
            ->with(['client.profile', 'professional.user.profile'])
            ->chunkById(100, function ($bookings) use ($notifications) {
                foreach ($bookings as $booking) {
                    $now = now();
                    $duration = (int) $booking->consultation_accumulated_seconds;
                    if ($booking->consultation_active_started_at) {
                        $activeEnd = $now;
                        foreach ([$booking->consultation_client_last_seen_at, $booking->consultation_professional_last_seen_at] as $seenAt) {
                            if ($seenAt && $seenAt->copy()->addSeconds(20)->lt($activeEnd)) $activeEnd = $seenAt->copy()->addSeconds(20);
                        }
                        if ($activeEnd->gt($booking->consultation_active_started_at)) {
                            $duration += $booking->consultation_active_started_at->diffInSeconds($activeEnd);
                        }
                        if ($activeEnd->lt($now)) {
                            $booking->consultation_accumulated_seconds = min(1800, $duration);
                            $booking->consultation_active_started_at = null;
                            $booking->save();
                        }
                    }
                    $remainingSeconds = max(0, 1800 - $duration);

                    if ($remainingSeconds <= 0) {
                        $booking->update([
                            'consultation_accumulated_seconds' => 1800,
                            'consultation_active_started_at' => null,
                            'consultation_closed_at' => $now,
                        ]);
                        continue;
                    }

                    if ($remainingSeconds <= 300 && ! $booking->consultation_warning_sent_at) {
                        $updated = Booking::query()
                            ->whereKey($booking->id)
                            ->whereNull('consultation_warning_sent_at')
                            ->update(['consultation_warning_sent_at' => now()]);

                        if ($updated === 1) {
                            $notifications->consultationEndingSoon($booking);
                        }
                    }
                }
            });

        return self::SUCCESS;
    }
}
