
function formatDate(date) {
    var month = date.getMonth()+1
    month = (month.toString().length > 1) ? month : "0"+month;
    var day = (date.getDate().toString().length>1) ? date.getDate():"0"+date.getDate();

    // return date.toISOString().split('T')[0]
    return date.getFullYear()+'-'+month+'-'+day
}

function checkDate(date) {
    for(var i = 0, len = calendar.length; i < len; i++) {
        if(calendar[ i ].date === date )
            return calendar[i];
    }
    return false;
}

function disabledDates(calendar, disabled_status){
    disable_dates = []
    $(calendar).each(function(key, value){
        if(disabled_status.includes(value['status'])){
            disable_dates.push(value['date'])
        }
    })
    return disable_dates
}

function onDayCreate(dObj, dStr, fp, dayElem) {
    var date_day = formatDate(dayElem.dateObj);
    date_cal = checkDate(date_day)
    if (dayElem.dateObj < moment().add(-1, 'days')) {
        dayElem.classList.add("day-prev");
    }
    if (date_cal['status'] == 'BLOCKED') {
        dayElem.classList.add("day-busy");
    } else if (date_cal['status'] == 'PARTIAL_FREE') {
        dayElem.classList.add("partial_free");
        partial_print(date_cal, dayElem, ["#00000000",
                                          $('.day-busy').css('background-color'),
                                          "#393939"]);
    } else if (date_cal['status'] == 'OPTION') {
        if (options_not_available) {
            dayElem.classList.add("day-busy");
        } else {
            dayElem.classList.add("option");
        }
    } else {
        dayElem.classList.add("day-available");
    }
}


function partial_print(date_cal, elem, colors){
    var range_hours = date_cal['available_range_hours'].concat(date_cal['unavailable_range_hours'])
    var min_range = range_hours[0][0]
    var max_range = range_hours[0][1]
    for (d in range_hours) {
        if (range_hours[d][0].replace(":", "") < min_range.replace(":", "")) {
            min_range = range_hours[d][0]
        }
        if (range_hours[d][1].replace(":", "") > max_range.replace(":", "")) {
            max_range = range_hours[d][1]
        }
    }
    var min_range_num = min_range.replace(":", "")
    var max_range_num = max_range.replace(":", "")
    var range = max_range_num - min_range_num;
    var gradient = ["to right", colors[1] + " 0%"];
    var sorted_urh = date_cal['available_range_hours'].sort()
    for (d in sorted_urh) {
        var range_hour = date_cal['available_range_hours'][d];
        var range_hour_0 = range_hour[0].replace(":", "")
        var range_hour_1 = range_hour[1].replace(":", "")
        gradient.push(colors[1] + " 0 " + (range_hour_0 - min_range_num)*100/range + "%")
        gradient.push(colors[0] + " 0 " + (range_hour_1 - min_range_num)*100/range + "%")
    }
    gradient.push(colors[1] + " 0");
    elem.style = "border: 0;background: linear-gradient(" + gradient.join(",") + "); color: " + colors[2]+
                    "; background-color: #A8DDCA;";
}

// Change function for routes in Boat Searcher Plugin and Boat List filter_date
$('#filter_route').change(function(){
    if ($('#id_route').length) {
        $('#id_route').val($('#filter_route').val())
    }
    if(!$('#filter_route').val().includes(',')){
        $('.date-duration').prop('required',true)
    } else {
        $('.date-duration').prop('required',false)
    }
    var option = $('<option></option>');

    // Clear fields
    $('.date-duration').html('');
    $('#id_date').val('');
    $('#start_date').val('');
    $('#end_date').val('');

    // Create selector for selected route
    $('.date-duration').append(option);
    if ($(this.selectedOptions[0]).data('durations')) {
        $('.date-duration').prop('disabled', false);

        // * Array of durations for selected route
        let durations = $(this.selectedOptions[0]).data('durations')

        for (let i = 0; i < durations.length; i++) {
            const duration = durations[i];

            // * Create option for each duration and set name and value
            let cloneOption = option.clone();
            cloneOption.html(duration.name);
            cloneOption.val(duration.duration);

            if (this == filter_route_duration) {
                cloneOption.prop('selected', true);
            }

            // * Append option to selector
            $('.date-duration').append(cloneOption);
        }


    } else {
        $('.date-duration').prop('disabled', true);
    }
});

function refresh_calendar_checkin(elem, url_checkins){
    // Disable submit button and all days in calendar
    $('#btn-searcher').prop('disabled', true)

    var duration = parseInt($(elem).val());
    var end_date = moment($(elem).closest('form').find("#start-date").val(), "YYYY-MM-DD")

    // Set duration value in hidden input in Boat Searcher Plugin
    if ($('#id_duration').length) {
        $('#id_duration').val(duration)
    }

    end_date = end_date.add(duration, 'days');
    $(elem).closest('form').find('#end-date').val(end_date.format("YYYY-MM-DD"));

    // Disable submit button and all days in calendar
    $($('#id_date')[0]._flatpickr.days).find('.flatpickr-day').addClass('disabled')
    $($('#id_date')[0]._flatpickr.days).find('.flatpickr-day').attr('disabled', true)

    // Disable find buttons
    $('#button-searcher-find-forward').prop('disabled', true)
    $('#button-searcher-find-back').prop('disabled', true)


    if ($('#filter_route').val()) {
        var ajax_data = {
            'date_from': moment($($('#id_date')[0]._flatpickr.days).find(':first-child')[0].dateObj).format('YYYY-MM-DD'),
            'date_to': moment($($('#id_date')[0]._flatpickr.days).find(':last-child')[0].dateObj).format('YYYY-MM-DD'),
            'id_one_way_route': $('#filter_route').val(),
            'duration': $('.date-duration').val()
        }
        $.ajax({
            url: url_checkins,
            method: 'GET',
            data: ajax_data,
            accepts: {
                json: 'application/json'
            },
            dataType: 'json',
            success: function(data) {
                var available_days = $(data.calendar).sort();
                if (available_days.length) {
                    // Set value to date field if it's blank
                    if (!$('#id_date').val()) {
                        $('#id_date').val(moment(available_days[0], "YYYY-MM-DD").format("DD/MM/YYYY"))
                        $('#start-date').val(available_days[0])
                        $('#end-date').val(moment(available_days[0], "YYYY-MM-DD").add(duration,'days').format("YYYY-MM-DD"))
                    }

                    // Enable sumbit button
                    $('#btn-searcher').prop('disabled', false)
                    // Enable available days to checkin in calendar
                    $(data.calendar).each(function(){
                        var day = $($('#id_date')[0]._flatpickr.days).find('[aria-label="' + this + '"]');
                        day.removeClass('disabled')
                        day.removeAttr('disabled')
                        day.css('background-color', '#b1d4eb')
                    })

                    let isToday = false

                    // * If no have selected day, select first available day in calendar
                    if ($('.dayContainer .flatpickr-day.selected').length == 0) {
                        let arrayFlatpickrDays = $('.dayContainer .flatpickr-day')
                        let i = 0
                        let selectedDay = false
                        while (!selectedDay && i < arrayFlatpickrDays.length) {
                            if (!arrayFlatpickrDays[i].classList.contains('disabled')) {
                                arrayFlatpickrDays[i].classList.add('selected')
                                selectedDay = true;

                                if (arrayFlatpickrDays[i].classList.contains('today')) {
                                    isToday = true
                                }
                            }
                            i++;
                        }
                    }


                    $('#button-searcher-find-forward').prop('disabled', false)
                    if (!isToday) {
                        $('#button-searcher-find-back').prop('disabled', false)
                    }

                } else {
                    $($('#id_date')[0]._flatpickr.days).find('.flatpickr-day').css('background-color','unset')
                }
            }
        })
    } else {
        var calendar = [];
        $($('#id_date')[0]._flatpickr.days).find('span').each(function() {
            // Get all saturdays after today
            if (moment(this.dateObj).weekday() == 6 && moment(this.dateObj) > moment()) {
                calendar.push(moment(this.dateObj).format('YYYY-MM-DD'));
            }
        })
        // Enable available days to checkin in calendar
        $(calendar).each(function(){
            var day = $($('#id_date')[0]._flatpickr.days).find('[aria-label="' + this + '"]');
            day.removeClass('disabled')
            day.removeAttr('disabled')
            day.css('background-color', '#b1d4eb')
        })

        // Enable sumbit button
        $('#btn-searcher').prop('disabled', false)
    }
}
