<?php

namespace App\Observers;

use App\Models\AppointmentAvailability;
use Illuminate\Support\Facades\Cache;

class AppointmentAvailabilityObserver
{
    /**
     * Handle the AppointmentAvailability "created" event.
     */
    public function created(AppointmentAvailability $appointmentAvailability)
    {
        $this->clearRelatedCache($appointmentAvailability);
    }

    /**
     * Handle the AppointmentAvailability "updated" event.
     */
    public function updated(AppointmentAvailability $appointmentAvailability)
    {
        $this->clearRelatedCache($appointmentAvailability);
    }

    /**
     * Handle the AppointmentAvailability "deleted" event.
     */
    public function deleted(AppointmentAvailability $appointmentAvailability)
    {
        $this->clearRelatedCache($appointmentAvailability);
    }

    /**
     * Handle the AppointmentAvailability "restored" event.
     */
    public function restored(AppointmentAvailability $appointmentAvailability)
    {
        $this->clearRelatedCache($appointmentAvailability);
    }

    /**
     * Handle the AppointmentAvailability "force deleted" event.
     */
    public function forceDeleted(AppointmentAvailability $appointmentAvailability)
    {
        $this->clearRelatedCache($appointmentAvailability);
    }

    /**
     * Clear all related cache entries for appointment availability
     */
    private function clearRelatedCache(AppointmentAvailability $appointmentAvailability)
    {
        // Clear user-specific cache
        if ($appointmentAvailability->user_id) {
            Cache::forget("appointment_availability_user_{$appointmentAvailability->user_id}");
        }

        // Clear community-specific cache
        if ($appointmentAvailability->community_id && $appointmentAvailability->community_category_id) {
            $deptId = $appointmentAvailability->community_category_dept_id ?? 0;
            Cache::forget("appointment_availability_community_{$appointmentAvailability->community_id}_{$appointmentAvailability->community_category_id}_{$deptId}");
            Cache::forget("appointment_availability_community_{$appointmentAvailability->community_id}_{$appointmentAvailability->community_category_id}_{$deptId}_dept");
        }

        // Clear racing community cache
        if ($appointmentAvailability->racing_community_id && $appointmentAvailability->location_id && $appointmentAvailability->sim_id) {
            Cache::forget("appointment_availability_race_{$appointmentAvailability->racing_community_id}_{$appointmentAvailability->location_id}_{$appointmentAvailability->sim_id}");
        }

        // Clear appointment and availability related cache keys
        Cache::forget('appointment_availability_' . $model->id);
        Cache::forget('appointments_calendar');
        Cache::forget('available_slots');
    }
}