
var waterdec = document.getElementById("water-decrement-button");
var waterinc = document.getElementById("water-increment-button");
var dhwdec = document.getElementById("dhw-decrement-button");
var dhwinc = document.getElementById("dhw-increment-button");
//var watertype = document.getElementById("water-type").value;
const toggleCSSclasses = (el, ...cls) => cls.map(cl => el.classList.toggle(cl))

function updateFireStatus(which, statusKey) {
    if ( which=="ch" ) {
    var fireStatusElement = document.getElementById("firestatus");
    } else if ( which=="dhw" ) {
    var fireStatusElement = document.getElementById("dhwstatus");
    }
	curstat=fireStatusElement.getAttribute("data-i18n")
	if (!curstat.includes(statusKey)) {
	if ( statusKey == "firestatus.heating" ) {
		fireStatusElement.classList.add('pulse', 'text-danger')
	} else {
		fireStatusElement.classList.remove('pulse', 'text-danger')
	}
    // Zapisz klucz tłumaczenia w `data-i18n`
    fireStatusElement.setAttribute("data-i18n", "[data-bs-title]"+statusKey);

    // Pobierz aktualne tłumaczenie
    const translatedText = i18next.t(statusKey);

    // Aktualizacja tooltipa Bootstrapa
    fireStatusElement.setAttribute("data-bs-title", translatedText);
    
    // Odśwież tooltip
    const tooltipInstance = bootstrap.Tooltip.getInstance(fireStatusElement);
    if (tooltipInstance) {
        tooltipInstance.dispose();
    }
    new bootstrap.Tooltip(fireStatusElement);
	}
}

let timer;
const debounce = (fn, delay) => {
  return (...args) => { // Zwróć funkcję, która przyjmuje dowolną liczbę argumentów
    clearTimeout(timer); // Anuluj poprzednio zaplanowaną funkcję, jeśli istnieje
    timer = setTimeout(() => { // Zaplanuj nową funkcję z podanym opóźnieniem
      fn.apply(this, args); // Wywołaj funkcję z podanymi argumentami
    }, delay);
  };
};

const sleepper = (fn, delay) => {
  let timer; // Przechowuje identyfikator timeoutu

  const debouncedFunction = (...args) => {
    clearTimeout(timer); // Anuluj poprzednio zaplanowaną funkcję, jeśli istnieje
    timer = setTimeout(() => {
      fn.apply(null, args); // Wywołaj funkcję z podanymi argumentami
    }, delay);
  };

  debouncedFunction.cancel = () => {
    clearTimeout(timer); // Anuluj zaplanowane wywołanie
  };

  return debouncedFunction;
};

dhwdec.onclick = () => {
$('#dhwtempval').val((parseInt($('#dhwtempval').val()) - 1));
let dhwtemp = $('#dhwtempval').val()
debounce(() => {
	tchange("dhw", dhwtemp, "1")
}, 1000)();
};

dhwinc.onclick = () => {
$('#dhwtempval').val((parseInt($('#dhwtempval').val()) + 1));
let dhwtemp = $('#dhwtempval').val()
debounce(() => {
	tchange("dhw", dhwtemp, "1")
}, 1000)();
};

/*var dhwtempval = $('#dhwtempval');
var intempval = $('#intempval');
const changeValue = (type,change) => {
    let currentValue
    switch(type){
        case "dhw":
            currentValue = parseInt(dhwtempval.val()) || 0;
	    dhwtempval.val(currentValue + change);
            break;
        case "heat":
            currentValue = parseFloat(intempval.val()) || 0;
	    intempval.val((currentValue + change).toFixed(1));
            break;
    }
};

const startChanging = (type,change) => {
    changeValue(type, change); // Zmień wartość natychmiast
    interval = setInterval(() => changeValue(type, change), 200); // Powtarzaj co 200ms
};

const stopChanging = (type) => {
    clearInterval(interval);
    let temp
    switch(type){
	case "dhw":
	    temp = dhwtempval.val();
	    break;
	case "heat":
	    temp = intempval.val();
	    break;
    }
    debounce(() => {
        tchange(type, temp, "1");
    }, 1000)();
};

// Obsługa przycisku zmniejszania
dhwdec.addEventListener('mousedown', () => startChanging("dhw",-1));
dhwdec.addEventListener('mouseup', stopChanging("dhw"));
dhwdec.addEventListener('mouseleave', stopChanging("dhw"));

// Obsługa przycisku zwiększania
dhwinc.addEventListener('mousedown', () => startChanging("dhw", 1));
//dhwinc.addEventListener('mouseup', () => stopChanging("dhw"));
dhwinc.addEventListener('mouseleave',() => stopChanging("dhw"));

// Obsługa przycisku zmniejszania
waterdec.addEventListener('mousedown', () => startChanging("heat",-0.2));
//waterdec.addEventListener('mouseup', () => stopChanging("heat"));
waterdec.addEventListener('mouseleave', () => stopChanging("heat"));

// Obsługa przycisku zwiększania
waterinc.addEventListener('mousedown', () => startChanging("heat", 0.2));
//waterinc.addEventListener('mouseup', () => stopChanging("heat"));
waterinc.addEventListener('mouseleave', () => stopChanging("heat"));
*/

waterdec.onclick = () => {
  if ($('#intempval').val() == minch ) {
          appendAlert("Setpoint cannot be lower than: " + minch +"°C", "danger");
          return
  }
  // Natychmiastowa akcja: zmniejsz wartość w #intempval o 0.2
  $('#intempval').val((parseFloat($('#intempval').val()) - 0.2).toFixed(1));
  let intemp = $('#intempval').val()
  // Opóźniona akcja: debounce
  debounce(() => {
//    alert(intemp); // Wyświetl alert
	  tchange("heat", intemp, "0")
    // setwatertemp('heat', document.getElementById('heat-input').value);
  }, 1000)();
};

waterinc.onclick = () => {
  // Natychmiastowa akcja: zmniejsz wartość w #intempval o 0.2
  if ($('#intempval').val() == maxch ) {
	  appendAlert("Setpoint cannot be more than: " + maxch +"°C", "danger");
	  return
  }
  $('#intempval').val((parseFloat($('#intempval').val()) + 0.2).toFixed(1));
  let intemp = $('#intempval').val()
  // Opóźniona akcja: debounce
  debounce(() => {
   // alert(intemp); // Wyświetl alert
	  tchange("heat", intemp, "0")
    // setwatertemp('heat', document.getElementById('heat-input').value);
  }, 1000)();
};

function setwatertemp(which, temp) {
  console.log(which);
  console.log(temp);
    const url = '/settemp'; // Adres URL API
    const data = new FormData(); // Utwórz nowy obiekt FormData
}

/*const alertPlaceholder = document.getElementById('liveAlertPlaceholder');
const appendAlert = (message, type) => {
    const wrapper = document.createElement('div');
    const progressBarColors = {
        success: '#0f5132',
        danger: '#842029',
        warning: '#664d03',
	info: '#055160'
    };
    const progressBarColor = progressBarColors[type] || '#333';
	console.log(message);
    const translatedMessage = i18next.exists(String(message)) ? i18next.t(String(message)) : String(message);

    wrapper.innerHTML = [
        `<div class="alert alert-${type} alert-dismissible fade show" role="alert">`,
        `   <div>${translatedMessage}</div>`,
        '   <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>',
        `   <div id="liveAlertProgressBar" class="progress-bar-striped progress-bar-animated" style="height: 5px; background: ${progressBarColor}; width: 100%;"></div>`,
        '</div>'
    ].join('');

    alertPlaceholder.append(wrapper);

    let progressBar = wrapper.querySelector('#liveAlertProgressBar');
    let width = 100;
    let interval = setInterval(() => {
        width -= 5;
        progressBar.style.width = width + '%';
        if (width <= 0) {
            clearInterval(interval);
            wrapper.remove();
        }
    }, 100);
}; */

$(document).ready(function () {
//        const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
 //       const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))

    const passwordModal = new bootstrap.Modal($('#passwordModal')[0]);
    restartModal = new bootstrap.Modal($('#restartModal')[0]);

    // Otwórz modal po kliknięciu przycisku
    $('#changePasswordBtn').click(function () {
        passwordModal.show();
    });

    $('#restartServiceBtn').click(function () {
	restartModal.show();
    });
    // Funkcja do sprawdzania złożoności hasła
    function validatePasswordStrength(password) {
        const regex = /^(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/;
        return regex.test(password);
    }

    // Sprawdzenie zgodności haseł + złożoności
    function validatePasswords() {
        const password = $('#newPassword').val();
        const confirm = $('#confirmPassword').val();
        const isStrong = validatePasswordStrength(password);

        if (password) {
            if (isStrong) {
                $('#newPassword').addClass("is-valid").removeClass("is-invalid");
            } else {
                $('#newPassword').addClass("is-invalid").removeClass("is-valid");
            }
        } else {
            $('#newPassword').removeClass("is-valid is-invalid");
        }

        if (confirm) {
            if (password === confirm) {
                $('#confirmPassword').addClass("is-valid").removeClass("is-invalid");
            } else {
                $('#confirmPassword').addClass("is-invalid").removeClass("is-valid");
            }
        } else {
            $('#confirmPassword').removeClass("is-valid is-invalid");
        }

        // Aktywacja przycisku tylko gdy hasło jest mocne i zgadza się z powtórzeniem
        if (isStrong && password === confirm) {
            $('#submitBtn').removeAttr("disabled");
        } else {
            $('#submitBtn').attr("disabled", true);
        }
    }

    // Wysłanie POST na backend (z użyciem $.post)
    function submitPasswordChange() {
        const user = "admin" // "admin" (domyślnie)
        const password = $('#newPassword').val();
        if (!user || !validatePasswordStrength(password) || password !== $('#confirmPassword').val()) {
            return;
        }
        $('#submitBtn')
            .html('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Zmieniam...')
            .attr("disabled", true);

        $.post('/changepass', { user: "admin", password: password }, function (data) {
		appendAlert(data, "success");
                passwordModal.hide();
		debounce(() => {$.get('/logout', function(data) {location.reload();});}, 2500)();

        }).fail(function () {
		appendAlert("Error", "danger");
	}).always(function () {
            // Przywrócenie normalnego przycisku po zakończeniu operacji
            $('#submitBtn')
                .html('Zmień hasło')
                .attr("disabled", false);
        });
    }
    errorRestart = sleepper(() => {
            restartModal.hide();
            appendAlert("Przekroczono czas oczekiwania. Prawdopodobnie usługa Haier nie uruchomiła się prawidłowo.", "danger", 0);
            $('#restartBtn')
                .html('Restart')
                .attr("disabled", false);
    }, 30000);

    function restartService() {
        $('#restartBtn')
            .html('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Restarting...')
            .attr("disabled", true);
	$.get('/restart');
	    errorRestart()
/*	debounce(() => {
	    restartModal.hide();
	    appendAlert("Usługa zrestartowana", "success");
	    $('#restartBtn')
                .html('Restart')
                .attr("disabled", false);

	}, 30000)();*/
    }
    // Nasłuchiwanie zmian w polach haseł
    $('#newPassword, #confirmPassword').on("input", validatePasswords);

    // Obsługa przycisku wysyłającego
    $('#submitBtn').click(submitPasswordChange);
    $('#restartBtn').click(restartService)
});
