(function () {
  function initReservationForm(form) {
    var dateInput = form.querySelector('[data-reservation-date]');
    var partySelect = form.querySelector('[data-party-size]');
    var timeSelect = form.querySelector('[data-reservation-time]');
    var note = form.querySelector('[data-availability-note]');

    if (!dateInput || !partySelect || !timeSelect || !note || typeof nazarReservationData === 'undefined') {
      return;
    }

    var messages = nazarReservationData.messages || {};
    var requestCounter = 0;

    function setPlaceholder(text, disabled) {
      timeSelect.innerHTML = '';
      var option = document.createElement('option');
      option.value = '';
      option.textContent = text;
      timeSelect.appendChild(option);
      timeSelect.disabled = !!disabled;
      timeSelect.value = '';
    }

    function updateAvailability() {
      var date = dateInput.value;
      var partySize = partySelect.value;

      if (!date || !partySize) {
        setPlaceholder(messages.chooseDateAndParty || 'Bitte wählen Sie zuerst Datum und Personenzahl.', true);
        note.textContent = messages.chooseDateAndParty || 'Bitte wählen Sie zuerst Datum und Personenzahl.';
        return;
      }

      requestCounter += 1;
      var currentRequest = requestCounter;

      setPlaceholder(messages.loading || 'Verfügbare Uhrzeiten werden geladen …', true);
      note.textContent = messages.loading || 'Verfügbare Uhrzeiten werden geladen …';

      var body = new URLSearchParams();
      body.append('action', 'nazar_get_available_times');
      body.append('nonce', nazarReservationData.nonce);
      body.append('reservation_date', date);
      body.append('party_size', partySize);

      fetch(nazarReservationData.ajaxUrl, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        },
        body: body.toString()
      })
        .then(function (response) {
          return response.json();
        })
        .then(function (payload) {
          if (currentRequest !== requestCounter) {
            return;
          }

          if (!payload || !payload.success || !payload.data) {
            throw new Error('invalid_response');
          }

          var times = Array.isArray(payload.data.times) ? payload.data.times : [];

          if (!times.length) {
            setPlaceholder(messages.empty || 'Für diese Auswahl ist aktuell keine freie Uhrzeit verfügbar.', true);
            note.textContent = payload.data.message || messages.empty || 'Für diese Auswahl ist aktuell keine freie Uhrzeit verfügbar.';
            return;
          }

          timeSelect.innerHTML = '';
          var defaultOption = document.createElement('option');
          defaultOption.value = '';
          defaultOption.textContent = 'Bitte wählen';
          timeSelect.appendChild(defaultOption);

          times.forEach(function (slot) {
            var option = document.createElement('option');
            option.value = slot.value;
            option.textContent = slot.label;
            timeSelect.appendChild(option);
          });

          timeSelect.disabled = false;
          note.textContent = payload.data.message || '';
        })
        .catch(function () {
          if (currentRequest !== requestCounter) {
            return;
          }

          setPlaceholder(messages.error || 'Die verfügbaren Uhrzeiten konnten gerade nicht geladen werden. Bitte versuchen Sie es erneut.', true);
          note.textContent = messages.error || 'Die verfügbaren Uhrzeiten konnten gerade nicht geladen werden. Bitte versuchen Sie es erneut.';
        });
    }

    dateInput.addEventListener('change', updateAvailability);
    partySelect.addEventListener('change', updateAvailability);
  }

  document.addEventListener('DOMContentLoaded', function () {
    document.querySelectorAll('[data-availability-form]').forEach(initReservationForm);
  });
})();
