/home/edulekha/crm.edulekha.com/modules/appointly/assets/js/services.js
function delete_service(id) {
    if (confirm(app.lang.confirm_action_prompt)) {
        $.post(admin_url + 'appointly/services/delete/' + id)
            .done(function(response) {
                try {
                    response = JSON.parse(response);
                    if (response.success) {
                        alert_float('success', response.message);
                        $('.table-services').DataTable().ajax.reload(null, false);
                    } else {
                        alert_float('warning', response.message || "An error occurred while processing your request");
                    }
                } catch (e) {
                    alert_float('danger', "An error occurred while processing your request");
                }
            })
            .fail(function(error) {
                alert_float('danger', "An error occurred while processing your request");
            });
    }
}

// Initialize services table and form handling
$(function () {
    
    var ServiceServerParams = {};
    initDataTable('.table-services', admin_url + 'appointly/services/table', [5], [5], ServiceServerParams, [0, 'asc']);

    // Set active menu state
    $('li.menu-item-appointly').addClass('active');
    $('li.menu-item-appointly > ul').addClass('in');
    $('li.sub-menu-item-appointly-services').addClass('active');

    // Initialize selectpicker
    if ($.fn.selectpicker) {
        $('.selectpicker').selectpicker({
            showSubtext: true
        });
    }

    // Initialize color picker
    if (typeof($.fn.colorpicker) === 'function') {
        $('input[name="color"]').colorpicker();
    }

    // Handle buffer time help text
    $('[data-toggle="tooltip"]').tooltip();

    // Add buffer explanation in the form
    $('#buffer_before, #buffer_after').on('change input', function() {
        var id = $(this).attr('id');
        var value = parseInt($(this).val()) || 0;
        
        if (value > 0) {
            var helpText = $('#' + id + '_help');
            var originalText = helpText.data('original-text');
            
            if (!originalText) {
                // Store original text the first time
                originalText = helpText.html().split('(')[0].trim();
                helpText.data('original-text', originalText);
            }
            
            helpText.html(originalText + ' (' + value + ' ' + appointlyLang.durationMinutes + ')');
        } else {
            var helpText = $('#' + id + '_help');
            var originalText = helpText.data('original-text');
            
            if (originalText) {
                helpText.html(originalText);
            }
        }
    });

    // Store the original help text on page load
    $('#buffer_before_help, #buffer_after_help').each(function() {
        var originalText = $(this).html().split('(')[0].trim();
        $(this).data('original-text', originalText);
    });

    // Handle staff selection change
    $('#staff_members').on('change', function() {
        var selectedStaff = $(this).val();
        updatePrimaryProviderDropdown(selectedStaff);
    });

    // Intercept onoffswitch clicks for services in use
    $(document).on('click', '.onoffswitch-checkbox[data-service-in-use="1"]', function(e) {
        e.preventDefault();
        e.stopPropagation();
        
        // Show warning message
        alert_float('warning', appointlyLang.appointly_service_in_use_warning);
        
        // Ensure the checkbox stays in its current state
        return false;
    });

    // Handle active checkbox for services in use on the edit form
    $('#active').on('change', function() {
        var $checkbox = $(this);
        var isServiceInUse = $checkbox.prop('disabled'); // If disabled, service is in use
        
        // If service is in use and checkbox is somehow enabled and unchecked
        if (isServiceInUse && !$checkbox.prop('checked')) {
            // Prevent the change and show warning
            $checkbox.prop('checked', true);
            alert_float('warning', appointlyLang.appointly_service_in_use_warning);
            return false;
        }
    });

    // Initialize form validation using Perfex CRM's appFormValidator
    $('#service-form').appFormValidator({
        rules: {
            name: 'required',
            'staff_members[]': 'required',
            price: {
                required: true,
                number: true,
                min: 0
            },
            duration: {
                required: true,
                number: true,
                min: 15
            }
        },
        messages: {
            name: appointlyLang.serviceNameRequired,
            'staff_members[]': appointlyLang.staffMembersRequired,
            price: {
                required: appointlyLang.priceRequired,
                number: appointlyLang.priceInvalid,
                min: appointlyLang.priceInvalid
            },
            duration: {
                required: appointlyLang.durationRequired,
                number: appointlyLang.durationInvalid,
                min: appointlyLang.durationInvalid
            }
        },
        submitHandler: function(form) {
            var $form = $(form);
            var $submitBtn = $form.find('button[type="submit"]');

            // Prevent double submission
            if ($submitBtn.prop('disabled')) {
                return false;
            }
            
            // Store original button text
            var originalBtnText = $submitBtn.html();
            
            // Disable submit button and show loading
            $submitBtn.prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i> ' + appointlyLang.submit);

            $.ajax({
                url: $form.attr('action'),
                type: 'POST',
                data: $form.serialize(),
                dataType: 'json',
                success: function(response) {
                    
                    if (response.success) {
                        if (response.warning) {
                            // Show warning message for services in use but still redirect
                            alert_float('warning', response.message);
                        } else {
                            // Show success message
                            alert_float('success', response.message);
                        }
                        
                        // Redirect to services list after a short delay
                        setTimeout(function() {
                            window.location.href = admin_url + 'appointly/services';
                        }, 1500);
                    } else {
                        // Show error message and stay on current page
                        alert_float('danger', response.message || 'An error occurred while processing your request');
                        $submitBtn.prop('disabled', false).html(originalBtnText);
                        
                        // Scroll to top to ensure user sees the error message
                        $('html, body').animate({ scrollTop: 0 }, 300);
                    }
                }
            });
            
            return false; // Prevent default form submission
        }
    });

    // On service deletion
    $('body').on('click', '.delete-service', function(e) {
        e.preventDefault();
        var serviceId = $(this).data('id');
        if (confirm(app.lang.confirm_action_prompt)) {
            $.post(admin_url + 'appointly/services/delete/' + serviceId)
                .done(function(response) {
                    try {
                        response = JSON.parse(response);
                        if (response.success) {
                            alert_float('success', response.message);
                            $('.table-services').DataTable().ajax.reload(null, false);
                        } else {
                            alert_float('warning', response.message || "An error occurred while processing your request");
                        }
                    } catch (e) {
                        alert_float('danger', "An error occurred while processing your request");
                    }
                })
                .fail(function(error) {
                    alert_float('danger', "An error occurred while processing your request");
                });
        }
    });

    // Initialize primary provider dropdown when the page loads
    var initialSelectedStaff = $('#staff_members').val();
    if (initialSelectedStaff) {
        updatePrimaryProviderDropdown(initialSelectedStaff);
    }
});

// Function to update primary provider dropdown based on selected staff
function updatePrimaryProviderDropdown(selectedStaff) {
    var primaryProviderSelect = $('#primary_provider');
    var primaryProviderWrapper = $('#primary_provider_wrapper');
    
    // Clear current options
    primaryProviderSelect.find('option').remove();
    
    if (!selectedStaff || selectedStaff.length === 0) {
        // Hide primary provider selection if no staff selected
        primaryProviderWrapper.addClass('hide');
        return;
    }
    
    // Show primary provider selection
    primaryProviderWrapper.removeClass('hide');
    
    // Get current primary provider value
    var currentPrimaryProvider = primaryProviderSelect.data('current');
    
    // Add default option (only if there's more than one staff member)
    if (selectedStaff.length > 1) {
        primaryProviderSelect.append('<option value="">' + appointlyLang.selectProvider + '</option>');
    }
    
    // Add options for selected staff
    $.each(selectedStaff, function(i, staffId) {
        var staffOption = $('#staff_members option[value="' + staffId + '"]');
        if (staffOption.length) {
            var staffName = staffOption.text();
            var selected = '';
            
            // Select the staff member if:
            // 1. It matches the current primary provider, or
            // 2. There's no current primary provider and this is the first staff member, or
            // 3. There's only one staff member selected
            if (staffId == currentPrimaryProvider || 
                (!currentPrimaryProvider && i === 0) || 
                selectedStaff.length === 1) {
                selected = 'selected';
            }
            
            primaryProviderSelect.append('<option value="' + staffId + '" ' + selected + '>' + staffName + '</option>');
        }
    });
    
    // Refresh selectpicker if it's initialized
    if (typeof($.fn.selectpicker) === 'function') {
        primaryProviderSelect.selectpicker('refresh');
    }
}