<?php

// SET DEFOULT 30min BOOKING SLOT INTERVAL
add_action('hivepress/v1/models/listing/create', function($listing_id) {
	if(hivepress()->get_version( 'bookings' )){
		update_post_meta($listing_id, 'hp_booking_slot_duration', 30);
		update_post_meta($listing_id, 'hp_booking_min_time', 0);
		update_post_meta($listing_id, 'hp_booking_max_time', 0);
        

	}
});

add_filter(
	'hivepress/v1/models/listing/attributes',
	function( $attributes ) {
		if ( isset($attributes['booking_slot_duration']) ) {
			$attributes['booking_slot_duration']['editable'] = false;
		}
		
		if ( isset($attributes['booking_slot_interval']) ) {
			$attributes['booking_slot_interval']['editable'] = false;
		}
		
		if ( isset($attributes['booking_moderated']) ) {
			$attributes['booking_moderated']['editable'] = false;
		}

		return $attributes;
	},
	1000,
    2
);

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// ADD LISTING ID AND MIN. SERV. TIME ON GLOBALS
add_filter(
    'hivepress/v1/templates/listing_view_page/blocks',
    function ($blocks, $template) {
        $listing = $template->get_context('listing');

        if (!$listing) {
            return $blocks;
        }

        $listing_id = $listing->get_id();
        $listing_price = $listing->get_price();

        // set listing id in globals
        $GLOBALS["listing_id"] = $listing_id;
        $GLOBALS["min_serv_time"] = $listing->display_min_service_time();
        $GLOBALS["services_interval"] = $listing->display_services_interval();
        $GLOBALS["listing_price"] = $listing_price;

        // Set global variables for Monday
        $GLOBALS["monday_start"] = $listing->display_monday_start();
        $GLOBALS["monday_end"] = $listing->display_monday_end();

        // Set global variables for Tuesday
        $GLOBALS["tuesday_start"] = $listing->display_tuesday_start();
        $GLOBALS["tuesday_end"] = $listing->display_tuesday_end();

        // Set global variables for Wednesday
        $GLOBALS["wednesday_start"] = $listing->display_wednesday_start();
        $GLOBALS["wednesday_end"] = $listing->display_wednesday_end();

        // Set global variables for Thursday
        $GLOBALS["thursday_start"] = $listing->display_thursday_start();
        $GLOBALS["thursday_end"] = $listing->display_thursday_end();

        // Set global variables for Friday
        $GLOBALS["friday_start"] = $listing->display_friday_start();
        $GLOBALS["friday_end"] = $listing->display_friday_end();

        // Set global variables for Saturday
        $GLOBALS["saturday_start"] = $listing->display_saturday_start();
        $GLOBALS["saturday_end"] = $listing->display_saturday_end();

        // Set global variables for Sunday
        $GLOBALS["sunday_start"] = $listing->display_sunday_start();
        $GLOBALS["sunday_end"] = $listing->display_sunday_end();

        return $blocks;
    },
    1000,
    2
);

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// ADD START AND END TIME IN BOOKING FORM
add_filter('hivepress/v1/forms/booking_make', 'form_mod1', 1000);
function form_mod1( $form ) {

    $form['fields']['_start_time'] = [
        'label'      => esc_html__( 'Start Time', 'hivepress-bookings' ),
        'type'       => 'select',
        'source'     =>  $form['fields']['_time']['source'],
        'required'   => true,
        '_separate'  => true,
        '_order'     => 5,
        'attributes' => [
            'data-parent' => '_dates',
            'class' => [ 'booking-time-start' ],
            'id' => 'booking-time-start',
            'onchange' => 'start_time_select_change()',
        ],
    ];

    $form['fields']['_end_time'] = [
        'label'      => esc_html__( 'End Time', 'hivepress-bookings' ),
        'type'       => 'select',
        'source'     =>  $form['fields']['_time']['source'],
        'required'   => false,
        '_separate'  => true,
        '_order'     => 5,

        'attributes' => [
            'data-parent' => '_dates',
            'class' => [ 'booking-time-end' ],
            'id' => 'booking-time-end',
            'onchange' => 'end_time_select_change()',
        ],
    ];

    $form['fields']['_dates']["attributes"] = [
            "id" => "booking-date",
            'onchange' => 'date_select_change()',
    ];

    $form['button']["attributes"]["id"] = "request-booking-btn";
	
    $form["attributes"]["id"] = "booking-form";

    return $form;
}

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// ADD ID TO SIDEBAR PRICE AND TOGGLE PRICE ATOMATIC CHANGE
add_filter(
	'hivepress/v1/templates/listing_view_page',
	function( $template ) {
		return hivepress()->helper->merge_trees(
			$template,
			[
				'blocks' => [
					'page_sidebar' => [
                        'blocks' => [
                                'listing_attributes_primary' => [
								    'area'      => 'view_block_primary',
                                    'attributes' => [
                                        'id' => 'sidebar_listing_price',
                                    ],
                                ],
                        ],
					],
				],
			]
		);
	},
	1000
);

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// DEACTIVARE MULTI TIME SELECT AND SET DATE AS FIRST IN ORDER (in listing booking block form)
add_filter(
	'hivepress/v1/forms/booking_make',
	function( $form ) {

		$form['fields']['_dates']['_order'] = 1;
        
        unset($form['fields']['_time']);

		return $form;
	},
	1000,
    2
);

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// HANDE BOOKING TIME ORDER HOURS
add_action('wp_footer', 'booking_time_handler');
    
function booking_time_handler()
{
    ?>
    <script>

        addDescriptions();

        var all_li_elements = [];
        var current_tot_price = 0;

        waitForElm("remove_dash_li", "body > span > span > span.select2-results");
        waitForElm("handle_start_span_change", getStartSpanSelector());
        waitForElm("handle_end_span_change", getEndSpanSelector());
        waitForElm("remove_li_after_maximum", getUlOuterSelector());
        waitForElm("remove_li_before_minimum", getUlOuterSelector());
        waitForElm("remove_li_out_of_service_time", getUlOuterSelector());

        function waitForElm(operation, selector, costum_values) {
            return new Promise(resolve => {
                if (document.querySelector(selector)) {
                    return resolve(document.querySelector(selector));
                }

            const observer = new MutationObserver(mutations => {
                if (document.querySelector(selector)) {

                    resolve(document.querySelector(selector));

                    switch (operation) {
                        case "remove_dash_li":
                            remove_li_after_dash(selector, observer);
                            break;
                    
                        case "handle_start_span_change":
                            removeDashFromSpan(true);
                            addBtnClick();
                            break;  
                            
                        case "handle_end_span_change":
                            removeDashFromSpan(false);
                            break; 

                        case "remove_li_before_minimum":
                            remove_li_before_minimum(selector, observer);
                            break;
                            
                        case "remove_li_after_maximum":
                            remove_li_after_maximum(selector, observer);
                            break;    

                        case "remove_li_out_of_service_time":
                            remove_li_out_of_service_time(selector, observer);
                            break;    
                    
                        default:
                            break;
                    }
                }
            });

            observer_connect(observer);
        });
    }

        function observer_connect(observer){

            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        }

        function removeDashFromSpan(isStartSpan){
            var selector = isStartSpan ? getStartSpanSelector() : getEndSpanSelector();
            
            var span_el = document.querySelector(selector);
            if(span_el.innerHTML != "—"
                && span_el.innerHTML.includes("-")){
                    span_el.innerHTML = span_el.innerHTML.split("-")[0];
                }
        }

        function remove_li_after_dash(selector, observer){

            var ul_el = getUlInner();

            if(ul_el.getElementsByTagName("li")[0] &&
                !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
                observer.disconnect();  

                var li_elements = ul_el.getElementsByTagName("li");

                for (let i = 0; i < li_elements.length; i++) {
                    var li_text = li_elements[i].innerHTML;

                    li_elements[i].innerHTML = li_text.split("-")[0];

                }

                observer_connect(observer);
            }
        }

        function remove_span_after_dash(selector, observer, time_remove_executions){
            var span_outer_el = document.querySelector(selector);
            var span_inner_el = span_outer_el.getElementsByTagName("span")[0];    
            span_inner_el.get

            if(!span_inner_el.innerHTML.includes("—")){
                    
                    observer.disconnect();  

                    span_text = span_inner_el.innerHTML;
                    span_inner_el.innerHTML = span_text.split("-")[0];

                    time_remove_executions++;

                    if(time_remove_executions < 2){

                        observer_connect(observer);
                    }
                }
            
        }

        function handle_span_change(){
            // START TIME SPAN
            var span_inner_el_start = getStartSpan();

            // END TIME SPAN
            var span_inner_el_end = getEndSpan();
            

            if(span_inner_el_start.innerHTML != "—"){

                var minimum_end = getMinimumEnd();

                // update_end_time_if_less_then_min();
                span_inner_el_end.innerHTML = "—";

            }
            else if(span_inner_el_start.innerHTML == "—"
                    &&  span_inner_el_end.innerHTML != "—"){
                
                span_inner_el_start.innerHTML = "—";
                span_inner_el_end.innerHTML = "—";
            }
        }

        function remove_li_before_minimum(selector, observer){

            var ul_el = getUlInner();

            if(ul_el.getElementsByTagName("li")[0]
                && !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
                
                observer.disconnect();  

                var li_elements = ul_el.getElementsByTagName("li");
                var zeroEl = null;
                // remove only if is end ul
                if(!is_start_ul(li_elements)){
                    
                    var keep_removing_from = null;
                    
                    for (let i = 0; i < li_elements.length; i++) {
                        var li_text = li_elements[i].innerHTML.trim();
                        // li_text = li_text.innerHTML;
                        
                        end_ul_set_selected();
                        var minEnd = getMinimumEnd();

                        var nextTime = calcTimes(li_text, '+', '00:30');      // next time = current + 30 min

                        // when minimum end time is reached, stop removing li elements
                        if(compareTimes(li_text, ">=", minEnd)){

                            if(keep_removing_from
                                || (li_elements[i+1]
                                && li_elements[i+1].innerHTML.trim() != nextTime)){

                                    if (keep_removing_from){
                                        
                                        ul_el.removeChild(li_elements[i]);
                                        i--;
                                    }
                                    else{
                                        keep_removing_from = li_elements[i+1].innerHTML;
                                    }
                                    
                                }
                            continue;
                        }
                        else if(li_text == '00:00'){
                            zeroEl = li_elements[i];
                            continue;
                        }
                        else{
                            ul_el.removeChild(li_elements[i]);
                            i--;
                        }
                        // li_elements[i].innerHTML = li_text.split("-")[0];
                        
                    }

                    if(zeroEl
                        && li_elements[0].innerHTML.trim() == '00:00'
                        && li_elements[li_elements.length - 1].innerHTML.trim() != '00:00'){

                        // remove 00:00 
                        ul_el.removeChild(zeroEl);

                        if(li_elements.length >= 1
                            && li_elements[li_elements.length -1].innerHTML.trim() == '23:30'
                            && compareTimes(getWeekDayValue('end'), '==', '24:00')
                             ){
                                // move 00:00 to the last element (re-add)
                                ul_el.appendChild(zeroEl);      
   
                            }
                    }

                    // return_val = LAST LIs SO YOU CAN END IN THE "SERVICE INTERVAL ZONE"
                    var last_value = li_elements[li_elements.length - 1].innerHTML.trim();
                    if(!li_elements[li_elements.length - 1].getAttribute("removedLasts")
                        && last_value != '00:00'
                        && last_value != getWeekDayValue('end')){
                        var services_interval = "<?php echo $GLOBALS['services_interval']; ?>";

                        var last_time_to_set =calcTimes(last_value, '-', services_interval);
                        last_time_to_set = calcTimes(last_time_to_set, '+', '00:30');

                        for (let i = 0; i < li_elements.length; i++) {
                            
                            var li_value = li_elements[i].innerHTML.trim();

                            if(compareTimes(li_value, '>', last_time_to_set)){
                                ul_el.removeChild(li_elements[i]);
                                i--;
                            }
                        }

                        li_elements[li_elements.length - 1].setAttribute("removedLasts", 'true')
                    }
                }
                observer_connect(observer);
            }
        }

        function remove_li_after_maximum(selector, observer){

            observer.disconnect();  
            var ul_el = getUlInner();

            var li_elements = ul_el.getElementsByTagName("li");

            if(ul_el.getElementsByTagName("li")[0]
                && !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
                

                // save all li elements with also removed ones (save before removing)
                if(all_li_elements.length == 0){
                    all_li_elements = li_elements;
                }

                var maximum_end = getMaximumEnd();
                // remove only if is end ul
                if(is_start_ul(li_elements)){
                    
                    var time_holes = [];

                    for (let i = 0; i < li_elements.length; i++) {
                        var li_text = li_elements[i].innerHTML;
                        
                        // when macimum end time is reached, remove all next li elements
                        if(compareTimes(li_text, ">", maximum_end)){
                            ul_el.removeChild(li_elements[i]);
                            i--;
                        }

                        var nextTime = calcTimes(li_text, '+', '00:30');      // next time = current + 30 min

                        // check if are missing times (already ordered)
                        if(li_elements[0]
                            && !li_elements[0].getAttribute('alreadyRemoved')
                            && li_elements[i+1]
                            && li_elements[i+1].innerHTML.trim() != nextTime){

                                time_holes.push([li_text, li_elements[i+1].innerHTML]);
                            }
                    }

                    var service_end = getWeekDayValue('end');
                    var last_time_available = li_elements[li_elements.length -1].innerHTML;

                    if(!li_elements[0].getAttribute('alreadyRemoved')
                        && compareTimes(last_time_available ,'<', getMaximumEnd())){
                        
                        time_holes.push([last_time_available, service_end]);
                    }

                    if(getCurrentStartValue().trim() == '00:00'
                        && getCurrentEndValue() == '00:00'){
                            time_holes = [];
                        }

                        time_holes.forEach(time_hole => {
                        
                        var min_serv_time = "<?php echo $GLOBALS['min_serv_time']; ?>";
                        var serv_interval = "<?php echo $GLOBALS['services_interval']; ?>";
                        var remove_start = calcTimes(time_hole[0], '-', calcTimes(calcTimes(min_serv_time, '+',serv_interval), '-', '01:00'));
                        var remove_end = calcTimes(time_hole[1], '+', calcTimes(serv_interval, '-', '00:30'));
                        
                        removeLiBetween(ul_el, li_elements, remove_start, remove_end);

                    });

                    li_elements[0].setAttribute('alreadyRemoved', 'true');
                }

                li_elements[li_elements.length - 1].classList.add("last_li");
            }
            observer_connect(observer);
        }

        function remove_li_out_of_service_time(selector, observer){
            
            var ul_el = getUlInner();
            
            if(ul_el.getElementsByTagName("li")[0]
                && !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
                
                observer.disconnect();  

                var li_elements = ul_el.getElementsByTagName("li");
                var day =getCurrentDateValue();

                // remove only if is end ul
                if(is_start_ul(li_elements)){

                    // remove before start time
                    for (let i = 0; i < li_elements.length; i++) {

                        var start_time = getWeekDayValue('start');
                        var li_value = li_elements[i].innerHTML;

                        if(compareTimes(li_value, "<", start_time)){
                            ul_el.removeChild(li_elements[i]);
                            i--;
                        }      
                    }
                }
                else{
                    var end_time = getWeekDayValue('end');

                    if(end_time == '00:00'
                    || end_time == '24:00'){
                        observer_connect(observer);
                        return;
                    }

                    // remove after end time
                    for (let i = 0; i < li_elements.length; i++) {
                        
                        var li_value = li_elements[i].innerHTML;
                        if(compareTimes(li_value, ">", end_time)){

                            ul_el.removeChild(li_elements[i]);
                            i--;
                            
                        }      
                    }
                }

                observer_connect(observer);
            }
        }
        

        function is_start_ul(li_elements){
            for (let i = 0; i < li_elements.length; i++) {
                
                // get start time from start span
                var start_time =  getCurrentStartValue();

                // if no time is set, say is start ul also if is not
                if(start_time == "—")
                    return true;

                // if the li is equal to the start selected time is the start ul
                if(li_elements[i].innerHTML == start_time
                    && li_elements[i].getAttribute("aria-selected") == "true"){

                    return true;
                }
            }

            // otherwise is end ul
            return false;
        }

        function compareTimes(time1, operator, time2){
            // Extract hours and minutes from time strings
            const [hours1, minutes1] = time1.split(':').map(Number);
            const [hours2, minutes2] = time2.split(':').map(Number);

            // Calculate total minutes since midnight for each time
            const totalMinutes1 = hours1 * 60 + minutes1;
            const totalMinutes2 = hours2 * 60 + minutes2;

            switch (operator) {
                case ">":
                    return totalMinutes1 > totalMinutes2;
                    break;

                case "<":
                    return totalMinutes1 < totalMinutes2;
                    break;

                case ">=":
                    return totalMinutes1 >= totalMinutes2;
                    break;
            
                case "<=":
                    return totalMinutes1 <= totalMinutes2;
                    break;

                case "==":
                    return totalMinutes1 == totalMinutes2;
                    break;
                    
                default:
                    return false;
                    break;
            }
        }

        function update_end_time_if_less_then_min(){
            var start_span_inner = getStartSpan();
            var end_span_inner = getEndSpan();
            var endSpanValue = end_span_inner.innerHTML;
            
            if(endSpanValue == '00:00'){
                endSpanValue = '24:00';
            }

            var minimumEnd = getMinimumEnd();
            if(endSpanValue == "—"
                || compareTimes(endSpanValue, "<", minimumEnd)){

                    if(minimumEnd == '24:00'){
                        minimumEnd = '00:00'
                    }

                    end_span_inner.innerHTML = minimumEnd;
                }

        }

        function end_ul_set_selected(){

            var ul_el = getUlInner();

            if(ul_el.getElementsByTagName("li")[0]
                && !ul_el.getElementsByTagName("li")[0].innerHTML.includes('Searching')){
                

                var li_elements = ul_el.getElementsByTagName("li");

                // remove only if is end ul
                if(!is_start_ul(li_elements)){

                    for (let i = 0; i < li_elements.length; i++) {
                        var li_text = li_elements[i].innerHTML;
                        
                        // when minimum end time is reached, stop removing li elements
                        if(compareTimes(li_text, "==", getCurrentEndValue())){
                            li_elements[i].setAttribute("aria-selected", "true");
                        }
                        else{
                            li_elements[i].setAttribute("aria-selected", "false");
                        }
                    }
                }
            }               
        }

        function addBtnClick(){
            var button = document.querySelector("#request-booking-btn");

            if(!button.hasClickListener){
                button.hasClickListener = true;
                button.addEventListener('click', function() {
                    // Code to be executed when the button is clicked

                    var form = document.querySelector("#booking-form");

                    form.addEventListener("submit", function(event) {

                        event.preventDefault(); // Prevent the form from submitting automatically

                        var actionLink = form.getAttribute("action");
                        var listing_id = 
                            <?php
                                if(isset($GLOBALS["listing_id"])){
                                    echo $GLOBALS["listing_id"];
                                }else{
                                    echo "'NOT_FOUND'";
                                }
                            ?>;

                        if(listing_id != "NOT_FOUND"){

                            var start_time = getCurrentStartValue().trim();
                            var end_time =getCurrentEndValue();
                            var date = getCurrentDateValue();
                            var price = current_tot_price;

                            actionLink += "?listing=" + listing_id;
                            actionLink += "&start_time=" + start_time;
                            actionLink += "&end_time=" + end_time;
                            actionLink += "&date="+date;
                            actionLink += "&price="+price;

                            // Manually redirect to the updated URL
                            
                            window.location.href = actionLink;
                            
                        }

                    });

                });
            }
        }

        function updatePriceVariable(){

            var time1 = getCurrentEndValue();
            var time2 = getCurrentStartValue();          

            if(!time1.includes("—") && !time2.includes("—")){
                var totHours = getServiceDuration();
                
                var listing_price = getListingPrice();
                
                if(listing_price != "NOT_FOUND"){
                    // set commitions (default (none): 1, 0)
                    var commission_percentage = 1.0;          // -> GET FROM HIVEPRESS (values like 1.15 for 15%, 1.2 for 20%)
                    var commission_fee = 0;                 // -> GET FROM HIVEPRESS

                    var finalPrice = listing_price * totHours;
                    // commissions calculation
                    finalPrice = (finalPrice * commission_percentage) + commission_fee;
                    current_tot_price = finalPrice;

                    var listing_price_str = priceNumberToScringWithZeros(listing_price);
                    var price_h_desc = '('+String(listing_price_str) + "€ /h)";
                    var tot_h_desc = hoursNumberToStringWithoutZeros(totHours) + ' ore';

                    var string_price = hoursNumberToStringWithZeros(current_tot_price);
                    getPriceElement().innerHTML = String(string_price) + " €";
                    getPriceDescriptionElement().innerHTML = tot_h_desc + ' '+price_h_desc;
                    // getTotPriceDescriptionElement().innerHTML = hoursNumberToStringWithoutZeros(totHours);
                }
            }
        }

        function calcTimes(time1, operator, time2) {
            // Parse the input times into hours and minutes
            const [hours1, minutes1] = time1.split(':').map(Number);
            const [hours2, minutes2] = time2.split(':').map(Number);
            let totalMinutes = 0;
            // Calculate total minutes
            if(operator == "+")
                totalMinutes = (hours1 + hours2) * 60 + (minutes1 + minutes2);
            else if(operator == "-")
                totalMinutes = (hours1 * 60 + minutes1) - (hours2 * 60 + minutes2);
            else{
                return "Operator not valid!";
            }

            // Calculate the new hours and minutes
            const newHours = Math.floor(totalMinutes / 60);
            const newMinutes = totalMinutes % 60;

            // Format the result
            const resultHours = String(newHours).padStart(2, '0');
            const resultMinutes = String(newMinutes).padStart(2, '0');

            return `${resultHours}:${resultMinutes}`;
        }

        function removeLiBetween(ul_el, li_elements, remove_start, remove_end){

            for (let i = 0; i < li_elements.length; i++) {
                var li_value = li_elements[i].innerHTML;  
                
                if(compareTimes(li_value, '>=', remove_start)
                    && compareTimes(li_value, '<=', remove_end)){

                        ul_el.removeChild(li_elements[i]);
                        i--;
                }
            }
        }

        function resetAllLabels(){

            getStartSpan().innerHTML = "—";
            getEndSpan().innerHTML = "—";
            getPriceDescriptionElement().innerHTML = "-";
            
            var listing_price = getListingPrice();
            listing_price = hoursNumberToStringWithZeros(listing_price);
            
            getPriceElement().innerHTML = listing_price + '€ /h';
        }

        function start_time_select_change() {

            removeDashFromSpan(true);
            handle_span_change();
            // addBtnClick();
            // observer_connect(observer);
            updatePriceVariable();
            // updatePrice();

            getEndSpan().innerHTML = "—";
            getPriceDescriptionElement().innerHTML = "-";
            
            var listing_price = getListingPrice();
            listing_price = hoursNumberToStringWithZeros(listing_price);
            
            getPriceElement().innerHTML = listing_price + '€ /h';
        }
        
        function end_time_select_change() {

            // observer.disconnect();
            removeDashFromSpan(false);
            // observer_connect(observer);
            updatePriceVariable();
            // updatePrice();
        }

        function date_select_change(){
            resetAllLabels();
        }
    
    function getCurrentStartValue(){
        var start_span_inner = getStartSpan();
        return start_span_inner.innerHTML;
    }

    function getCurrentEndValue(){
            var end_span_inner = getEndSpan();
            return end_span_inner.innerHTML.trim();
    }

    function getCurrentDateValue(){
        var date_input = document.querySelector("#booking-date").getElementsByTagName("input")[0];

        return date_input.value;
    }
        
    function getMinimumServiceTime(){

        var min_serv_time = "<?php
            if(isset($GLOBALS["min_serv_time"])){
                echo $GLOBALS["min_serv_time"];
            }
            else{
                echo "ERR: min_serv_time not found";
            }
        ?>";

        return min_serv_time;                      // -> GET FROM PARAMS WORDPRESS
    }

    function getUlOuterSelector(){
        return "body > span > span > span.select2-results";                      
    }

    function getStartSpanSelector(){
        return "#select2-booking-time-start-container";
    }

    function getStartSpan(){
        return document.querySelector(getStartSpanSelector());
    }

    function getEndSpanSelector(){
        return "#select2-booking-time-end-container";                      
    }

    function getEndSpan(){
        return document.querySelector(getEndSpanSelector());
    }

    function getUlInner(){
        return document.querySelector(getUlOuterSelector()).getElementsByTagName("ul")[0];
    }
    
    function getPriceElementSelector(){
        return "#sidebar_listing_price > div";
    }

    function getPriceElement(){
        return document.querySelector(getPriceElementSelector());
    }

    function getPriceDescriptionElement(){
        return document.querySelector("#price_h_description");
    }

    // function getTotPriceDescriptionElement(){
    //     return document.querySelector("#tot_h_description");
    // }
        
    

    function getMinimumEnd(){

        var start_time = getCurrentStartValue();
        var minimum_service_time = getMinimumServiceTime();     

        // Parse the start_time string to create a Date object
        var startTimeParts = start_time.split(":");
        var startDate = new Date();
        startDate.setHours(parseInt(startTimeParts[0], 10));
        startDate.setMinutes(parseInt(startTimeParts[1], 10));

        // Parse the minimum_service_time string to create a Date object
        var [minHours, minMinutes] = minimum_service_time.split(':');
        minHours = parseInt(minHours);
        minMinutes = parseInt(minMinutes);

        // Add 2 hours and 30 minutes to the start_time
        var endTime = new Date(startDate.getTime() + (minHours * 60 * 60 * 1000) + (minMinutes * 60 * 1000)); // Adding 30 minutes););

        // Format the endTime as "HH:mm"
        var endHours = endTime.getHours().toString().padStart(2, '0');
        var endMinutes = endTime.getMinutes().toString().padStart(2, '0');
        var min_end = endHours + ":" + endMinutes;
        
        if(min_end == '00:00'){
            min_end = '24:00';
        }
        
        return min_end;
    }

    function getMaximumEnd(){

        var minimum_service_time = getMinimumServiceTime();     
        
        var li_elements = all_li_elements; 

        var last_hour = getWeekDayValue('end');
        
        // Parse the start_time string to create a Date object
        var lastTimeParts = last_hour.split(":");
        var lastDate = new Date();
        lastDate.setHours(parseInt(lastTimeParts[0], 10));
        lastDate.setMinutes(parseInt(lastTimeParts[1], 10));

        // Parse the last_hour string to create a Date object
        var [minHours, minMinutes] = minimum_service_time.split(':');
        minHours = parseInt(minHours);
        minMinutes = parseInt(minMinutes);

        // Add 2 hours and 30 minutes to the last_hour
        var endTime = new Date(lastDate.getTime() - (minHours * 60 * 60 * 1000 + minMinutes * 60 * 1000)); // Adding 30 minutes);

        // Format the endTime as "HH:mm"
        var endHours = endTime.getHours().toString().padStart(2, '0');
        var endMinutes = endTime.getMinutes().toString().padStart(2, '0');
        var max_end = endHours + ":" + endMinutes;

        return max_end;
    }

    function getDayOfWeek(dateString) {
        // Parse the date string into a Date object
        var date = new Date(dateString);

        // Get the day of the week (0-6)
        var dayOfWeek = date.getDay();

        // Array to map the numerical day of the week to a string
        var days = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];

        // Return the day of the week as a string
        return days[dayOfWeek];
    }

    function getWeekDayValue(start_or_end){

        var week_day = getDayOfWeek(getCurrentDateValue());
        
        var return_val = "";
        if(start_or_end == 'start'){
            switch (week_day) {

                case 'monday':
                    return_val =  "<?php echo $GLOBALS['monday_start'] ?>";
                    break;
                
                case 'tuesday':
                    return_val =  "<?php echo $GLOBALS['tuesday_start'] ?>";
                    break;
                
                case 'wednesday':
                    return_val =  "<?php echo $GLOBALS['wednesday_start'] ?>";
                    break;
                
                case 'thursday':
                    return_val =  "<?php echo $GLOBALS['thursday_start'] ?>";
                    break;
                
                case 'friday':
                    return_val =  "<?php echo $GLOBALS['friday_start'] ?>";
                    break;
                
                case 'saturday':
                    return_val =  "<?php echo $GLOBALS['saturday_start'] ?>";
                    break;
                
                case 'sunday':
                    return_val =  "<?php echo $GLOBALS['sunday_start'] ?>";
                    break;
                
                default:
                    return_val =  'undefined';
                    break;
            }

            if(return_val == ''){
                return_val = "00:00";
            }
        }
        else if(start_or_end == 'end'){
            switch (week_day) {

                case 'monday':
                    return_val =  "<?php echo $GLOBALS['monday_end'] ?>";
                    break;
                
                case 'tuesday':
                    return_val =  "<?php echo $GLOBALS['tuesday_end'] ?>";
                    break;
                
                case 'wednesday':
                    return_val =  "<?php echo $GLOBALS['wednesday_end'] ?>";
                    break;
                
                case 'thursday':
                    return_val =  "<?php echo $GLOBALS['thursday_end'] ?>";
                    break;
                
                case 'friday':
                    return_val =  "<?php echo $GLOBALS['friday_end'] ?>";
                    console.log(return_val);
                    break;
                
                case 'saturday':
                    return_val =  "<?php echo $GLOBALS['saturday_end'] ?>";
                    console.log(return_val);
                    break;
                
                case 'sunday':
                    return_val =  "<?php echo $GLOBALS['sunday_end'] ?>";
                    break;
                
                default:
                    return_val =  'undefined';
                    break;
            }

            if(return_val == "00:00"
                || return_val == ''){
                return_val = "24:00";
            }
        }
        
        return return_val;
    }

    function getServiceDuration(){
        var time1 = getCurrentEndValue();
        var time2 = getCurrentStartValue();
        var result = null;

        if(time1 == '00:00'){
            time1 = '24:00';
        }

        if(!time1.includes("—") && !time2.includes("—")){
            const [hours1, minutes1] = time1.split(':').map(Number);
            const [hours2, minutes2] = time2.split(':').map(Number);

            const totalMinutes1 = hours1 * 60 + minutes1;
            const totalMinutes2 = hours2 * 60 + minutes2;

            const differenceInMinutes = totalMinutes1 - totalMinutes2;
            result = differenceInMinutes / 60;
        }
        
        return result;
    }

    function hoursNumberToStringWithoutZeros(decimalHour){

        if (decimalHour >= 0 && decimalHour <= 24) {
            
            var hours = Math.floor(decimalHour);
            var minutes = Math.round((decimalHour - hours) * 60);
            var hoursString = hours;// < 10 ? '0' + hours : hours;
            var minutesString = minutes < 10 ? '0' + minutes : minutes;

            minutesString = minutes > 0 ? ':' + minutesString : ''

            return hoursString + minutesString;
        } else {
            return "Invalid input";
        }
    }

    function hoursNumberToStringWithZeros(price){
        price = parseFloat(price);

        // Check if the price has decimal values
        if (price % 1 !== 0) {
            // If it has decimal values, format it to have 2 decimal places
            return price.toFixed(2);
        } else {
            // If it's an integer, add ".00" to represent the decimal values
            return price + ".00";
        }
    }

    function priceNumberToScringWithZeros(price){
        // Check if the price has decimal places
        if (price % 1 !== 0) {
            // If there are decimal places, format with two decimal places
            return price.toFixed(2);
        } else {
            // If there are no decimal places, return the price as is
            return price.toString();
        }
    }

    function addDescriptions(){
        window.addEventListener('load', function () {

            //---------------------------------------------------------------------------

            // PIRCE / H LABEL under tot price
            var price_element = document.querySelector('#sidebar_listing_price');

            if(price_element){
                
                var price_h_description = document.createElement('div');
                price_h_description.classList.add('hp-field__description');
                price_h_description.id = 'price_h_description';
                price_h_description.innerHTML = '-';

                price_element.appendChild(price_h_description);
            }

            //---------------------------------------------------------------------------

            // TOT H LABEL above REQUEST BOOKING BUTTON
            // var booking_form_element = document.querySelector('#booking-form');
            // var hp_form_fields = booking_form_element.getElementsByClassName('hp-form__fields')[0];
            // var tot_h_description = document.createElement('div');
            // tot_h_description.classList.add('hp-field__description');
            // tot_h_description.id = 'tot_h_description';
            // tot_h_description.innerHTML = '-';

            // hp_form_fields.appendChild(tot_h_description);

            // var childs_count = booking_form_element.children.length;
            // booking_form_element.insertBefore(tot_h_description, booking_form_element.childNodes[childs_count-1]);

        });
    }

    function getListingPrice(){
        var price = <?php
            if(isset($GLOBALS["listing_price"])){
                echo $GLOBALS["listing_price"];
            }else{
                error_log("ERROR: listing price not found");
                echo "'NOT_FOUND'";
            }
            ?>;

        return price;
    }

    </script>
    <?php
}

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// SET COSTUM DATE AND TIME IN THE DATABASE
add_action('hivepress/v1/models/booking/update', function($booking_id ) {

    if(hivepress()->get_version( 'bookings' )
        && isset($_GET['start_time'])){

        $listing_id = $_GET['listing'];
        $start_time = $_GET['start_time'];
        $end_time = $_GET['end_time'];
        $start_date = $_GET['date'];
        $end_date = $_GET['date'];
        $price = $_GET['price'];

        $GLOBALS['start_time'] = $_GET['start_time'];
        $GLOBALS['end_time'] = $_GET['end_time'];
        $GLOBALS['date'] = $_GET['date'];
        // $GLOBALS['price'] = $_GET['price'];

        if($end_time == '00:00'){
            $end_date = date('d-m-Y', strtotime($end_date . ' + 1 day'));
        }

        update_post_meta( $booking_id, 'hp_start_time',  strtotime("$start_date $start_time"));
        update_post_meta( $booking_id, 'hp_end_time', strtotime("$end_date $end_time"));     

        setWooCommerceCartPrice($listing_id, $price);
    }
});

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// Set manually the woocommerce cart price ( *2 the price becouse after we will divide by 2)
function setWooCommerceCartPrice($listing_id, $price){

    // Product ID to add to the cart
    $product_id = getProductId($listing_id);
    
    if($product_id){
        // Get the WooCommerce cart object
        $cart = WC()->cart;

        // Empty cart.
        WC()->cart->empty_cart();

        // Quantity of the product to add to the cart
        $quantity = 1; // You can change this value as needed

        // Add the product to the cart
        $cart->add_to_cart( $product_id, $quantity );

         // Modify cart item prices or quantities here
        foreach (  $cart->get_cart() as $cart_item_key => $cart_item ) {

            // Calculate new price (original price * 3)
            $new_price = $price * 2;

            // Set the new price for the cart item
            $cart_item['data']->set_price( $new_price );

            // Update cart item price and total
            $cart->cart_contents[ $cart_item_key ]['data']->set_price( $new_price );
            $cart->cart_contents[ $cart_item_key ]['line_total'] = $new_price * $cart_item['quantity'];
            $cart->cart_contents[ $cart_item_key ]['line_subtotal'] = $new_price * $cart_item['quantity'];
        }

        // Calculate totals and refresh cart
        $cart->calculate_totals();
    }
}

function getProductId($listing_id){

    $post_name = get_post_field('post_name', $listing_id);

    if ($post_name) {

        $product_id = 0;
        // WP_Query arguments
        $args = array(
            'post_type' => 'product', // Specify the post type
            'name' => $post_name, // Specify the post_name (slug)
            'posts_per_page' => 1, // Limit the number of posts to 1
        );

        // The Query
        $query = new WP_Query($args);

        // Check if the query has any posts
        if ($query->have_posts()) {
            // Loop through the posts
            while ($query->have_posts()) {
                $query->the_post();
                // Get the post ID
                $product_id = get_the_ID();
            }
            // Restore original post data
            wp_reset_postdata();
            return $product_id;
        } else {
            // No posts found
            return null;
        }

    } else {
        return null;
    }
}

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------

// every price calculation divide the cart total by 2 so the price will be correct
add_action('woocommerce_before_calculate_totals', 'set_half_price');

function set_half_price($cart) {

    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    foreach ($cart->get_cart() as $cart_item) {
        $product_price = $cart_item['data']->get_price(); // Get the original product price
        $half_price = $product_price / 2; // Calculate half price

        // Set the new price to half only during checkout
        $cart_item['data']->set_price($half_price);
    }
}