// Load server options. Once a successful callback is made from this, we can populate the choice boxes in the form and load
// any saved values from local storage.
function loadOptions() {
    $.getJSON('/api/v1/options', function(jsonData) {
        // Store options
        options = jsonData;

        // Populate modes drop-down
        $.each(options["modes"], function (i, m) {
            $('#mode').append($('<option>', {
                value: m,
                text : m
            }));
        });

        // Populate SIG drop-down
        $.each(options["sigs"], function (i, sig) {
            $('#sig').append($('<option>', {
                value: sig.name,
                text : sig.name
            }));
        });

        // Load settings from settings storage now all the controls are available
        loadSettings();
    });
}

// Method called to add a spot to the server
function addSpot() {
    try {
        // Save settings (this will save "your call" for future use)
        saveSettings();

        // Unpack the user's entered values
        var dx = $("#dx-call").val().toUpperCase();
        var freqStr = $("#freq").val();
        var mode = $("#mode")[0].value;
        var sig = $("#sig")[0].value;
        var sigRef = $("#sig-ref").val();
        var dxGrid = $("#dx-grid").val();
        var comment = $("#comment").val();
        var de = $("#de-call").val().toUpperCase();

        var spot = {}
        if (dx != "") {
            spot["dx_call"] = dx;
        } else {
            showAddSpotError("A DX callsign is required in order to spot.");
            return;
        }
        if (freqStr != "") {
            spot["freq"] = parseFloat(freqStr) * 1000;
        } else {
            showAddSpotError("A frequency is required in order to spot.");
            return;
        }
        if (mode != "") {
            spot["mode"] = mode;
        }
        if (sig != "") {
            spot["sig"] = sig;
        }
        if (sigRef != "") {
            spot["sig_refs"] = [{id: sigRef}];
        }
        if (dxGrid != "") {
            spot["dx_grid"] = dxGrid;
        }
        if (comment != "") {
            spot["comment"] = comment;
        }
        if (de != "") {
            spot["de_call"] = de;
        } else {
            showAddSpotError("A spotter callsign is required in order to spot.");
            return;
        }
        spot["time"] = moment.utc().valueOf() / 1000.0;

        $.ajax("/api/v1/spot", {
            data : JSON.stringify(spot),
            contentType : 'application/json',
            type : 'POST',
            timeout: 10000,
            success: async function (result) {
                $("#result-good").html("<div class='alert alert-success fade show mb-0 mt-4' role='alert'><i class='fa-solid fa-check'></i> Spot submitted. Returning you to the spots list...</div>");
                $("#result-bad").html("");
                setTimeout(() => {
                    $("#result-good").hide();
                    window.location.replace("/");
                }, 1000);
            },
            error: function (result) {
                showAddSpotError(result.responseText.slice(1,-1));
            }
        });
    } catch (error) {
        showAddSpotError(error);
    }
    return false;
}

// Show an "add spot" error.
function showAddSpotError(text) {
    $("#result-bad").html("<div class='alert alert-danger alert-dismissible fade show mb-0 mt-4' role='alert'><i class='fa-solid fa-triangle-exclamation'></i> " + text + "<button type='button' class='btn-close' data-bs-dismiss='alert' aria-label='Close'></button></div>");
}

// Force callsign and mode capitalisation
$("#dx-call").change(function () {
    $(this).val($(this).val().trim().toUpperCase());
});
$("#de-call").change(function () {
    $(this).val($(this).val().trim().toUpperCase());
});
$("#mode").change(function () {
    $(this).val($(this).val().trim().toUpperCase());
});

// Display the intro box, unless the user has already dismissed it once.
function displayIntroBox() {
    if (localStorage.getItem("add-spot-intro-box-dismissed") == null) {
        $("#add-spot-intro-box").show();
    }
    $("#add-spot-intro-box-dismiss").click(function() {
        localStorage.setItem("add-spot-intro-box-dismissed", true);
    });
}

// Startup
$(document).ready(function() {
    // Load options
    loadOptions();
    // Display intro box
    displayIntroBox();
});