/**
 * @typedef {Object} BroadcastZone
 * @property {number} index
 * @property {string} description
 * @property {String} SoundChannel
 * @property {String} Box
 * @property {String} Relay
 */

/**
 * List of broadcast zones available
 * @type {BroadcastZone[]}
 */
window.BroadcastZoneList ??= [];

/**
 * Currently selected broadcast zone row in the table
 * @type {JQuery<HTMLElement>|null}
 */
window.selectedBroadcastZoneRow = null;

/**
 * List of sound channels available
 * @type {String[]}
 */
window.SoundChannelList = []

/**
 * Fill broadcast zone table body with values
 * @param {BroadcastZone[]} vv values to fill
 */
function fill_broadcastzonetablebody(vv) {
    $('#broadcastzonetablebody').empty();
    if (!Array.isArray(vv) || vv.length === 0) return;
    vv.forEach(item => {
        const row = `<tr>
            <td>${item.index}</td>
            <td>${item.description}</td>
            <td>${item.soundChannel}</td>
            <td>${item.id}</td>
            <td>${item.bp}</td>
        </tr>`;
        $('#broadcastzonetablebody').append(row);
        let $addedrow = $('#broadcastzonetablebody tr:last');
        $addedrow.off('click').on('click', function () {
            if (window.selectedBroadcastZoneRow) {
                window.selectedBroadcastZoneRow.find('td').css('background-color', '');
                if (window.selectedBroadcastZoneRow.is($(this))) {
                    window.selectedBroadcastZoneRow = null;
                    $('#btnRemove').prop('disabled', true);
                    $('#btnEdit').prop('disabled', true);
                    return;
                }
            }
            $(this).find('td').css('background-color', '#ffeeba');
            window.selectedBroadcastZoneRow = $(this);
            $('#btnRemove').prop('disabled', false);
            $('#btnEdit').prop('disabled', false);
        });
    });
    $('#tablesize').text("Table Size: " + vv.length);
}

/**
 * Reload broadcast zones from server
 * @param {String} APIURL API URL endpoint (default "BroadcastZones/")
 */
function reloadBroadcastZones(APIURL = "BroadcastZones/") {
    window.BroadcastZoneList = [];
    fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
        if (Array.isArray(okdata)) {
            //console.log("reloadBroadcastZones : ", okdata)
            window.BroadcastZoneList.push(...okdata);
            fill_broadcastzonetablebody(window.BroadcastZoneList);
        } else console.log("reloadBroadcastZones: okdata is not array");
    }, (errdata) => {
        alert("Error loading broadcast zones : " + errdata.message);
    });
}

function fetchSoundChannels(APIURL = "SoundChannel/") {
    window.SoundChannelList = [];
    fetchAPI(APIURL + "SoundChannelDescriptions", "GET", {}, null, (okdata) => {
        if (Array.isArray(okdata)) {
            //console.log("fetchSoundChannels : ", okdata)
            window.SoundChannelList.push(...okdata);
        } else console.log("fetchSoundChannels: okdata is not array");
    }, (errdata) => {
        alert("Error loading sound channels : " + errdata.message);
    });
}

$(document).ready(function () {
    console.log("broadcastzones.js loaded successfully");
    window.selectedBroadcastZoneRow = null;
    let $btnClear = $('#btnClear');
    let $btnAdd = $('#btnAdd');
    let $btnEdit = $('#btnEdit');
    let $btnRemove = $('#btnRemove');
    let $btnExport = $('#btnExport');
    let $btnImport = $('#btnImport');
    $btnEdit.prop('disabled', true);
    $btnRemove.prop('disabled', true);
    let APIURL_BroadcastZone = "BroadcastZones/";


    let $broadcastzonemodal = $('#broadcastzonemodal');
    let $broadcastzoneindex = $broadcastzonemodal.find('#broadcastzoneindex');
    let $broadcastzonedescription = $broadcastzonemodal.find('#broadcastzonedescription');
    let $broadcastzonesoundchannel = $broadcastzonemodal.find('#broadcastzonesoundchannel');
    let $broadcastzonebox = $broadcastzonemodal.find('#broadcastzonebox');

    

    let $findzone = $('#findzone');
    $findzone.off('input').on('input', function () {
        let searchTerm = $findzone.val().trim().toLowerCase();
        if (searchTerm.length > 0) {
            window.selectedBroadcastZoneRow = null;
            let filtered = window.BroadcastZoneList.filter(item => item.description.toLowerCase().includes(searchTerm) || item.id.toLowerCase().includes(searchTerm) || item.soundChannel.toLowerCase().includes(searchTerm) || item.bp.toLowerCase().includes(searchTerm));
            fill_broadcastzonetablebody(filtered);
        } else {
            window.selectedBroadcastZoneRow = null;
            fill_broadcastzonetablebody(window.BroadcastZoneList);
        }
    });

    /**
     * Find Checkbox for relays 1 to 32
     * Checkbox id is 01 to 32 with leading zero for 1 to 9
     * @param {number} id 1 - 32 
     * @returns JQuery<HTMLElement>
     */
    function cbRelay(id) {
        return $broadcastzonemodal.find('#R' + (id < 10 ? '0' : '') + id);
    }

    /**
     * Clear broadcast zone modal to default state
     */
    function clearBroadcastZoneModal() {
        $broadcastzoneindex.prop('disabled', true).val('');
        $broadcastzonedescription.val('');
        // fill broadcastzonesoundchannel from SoundChannelList
        $broadcastzonesoundchannel.empty();
        console.log("SoundChannelList:", window.SoundChannelList);
        if (Array.isArray(window.SoundChannelList) && window.SoundChannelList.length > 0) {
            // SoundChannelList ada isinya
            window.SoundChannelList.forEach(ch => {
                if (ch && ch.length>0){
                    $broadcastzonesoundchannel.append($('<option>').val(ch).text(ch));
                }
            
            });
        }
        $broadcastzonebox.val('1').prop('disabled', true);
        for (let i = 1; i <= 32; i++) {
            cbRelay(i).prop('checked', false);
        }
    }

    fetchSoundChannels();
    reloadBroadcastZones(APIURL_BroadcastZone);

    $btnClear.off('click').on('click', () => {
        DoClear(APIURL_BroadcastZone, "BroadcastZones", (okdata) => {
            reloadBroadcastZones(APIURL_BroadcastZone);
            alert("Success clear broadcast zones: " + okdata.message);
        }, (errdata) => {
            alert("Error clear broadcast zones: " + errdata.message);
        });
    });

    $btnAdd.off('click').on('click', () => {
        $broadcastzonemodal.modal('show');
        clearBroadcastZoneModal();

        $broadcastzonemodal.off('click.broadcastzonesave').on('click.broadcastzonesave', '#broadcastzonesave', function () {

            let description = $broadcastzonedescription.val().trim();
            let soundChannel = $broadcastzonesoundchannel.val().trim();
            let box = $broadcastzonebox.val().trim();
            let relayArray = [];
            for (let i = 1; i <= 32; i++) {
                if (cbRelay(i).is(':checked')) {
                    relayArray.push(i);
                }
            }
            let relay = relayArray.join(';');
            if (description.length === 0) {
                alert("Description cannot be empty");
                return;
            }
            if (soundChannel.length === 0) {
                alert("Sound Channel cannot be empty");
                return;
            }
            if (box.length === 0) {
                alert("Box cannot be empty");
                return;
            }
            if (relayArray.length === 0) {
                alert("At least one relay must be selected");
                return;
            }
            let bz = {
                description: description,
                SoundChannel: soundChannel,
                Box: box,
                Relay: relay
            };
            fetchAPI(APIURL_BroadcastZone + "Add", "POST", {}, bz, (okdata) => {
                reloadBroadcastZones(APIURL_BroadcastZone);
                alert("Success add new broadcast zone: " + okdata.message);
            }, (errdata) => {
                alert("Error add new broadcast zone: " + errdata.message);
            });

            $broadcastzonemodal.modal('hide');
        });
        $broadcastzonemodal.off('click.broadcastzoneclose').on('click.broadcastzoneclose', '#broadcastzoneclose', function () {
            $broadcastzonemodal.modal('hide');
        });
    });

    $btnRemove.off('click').on('click', () => {
        if (window.selectedBroadcastZoneRow) {
            let cells = window.selectedBroadcastZoneRow.find('td');
            /** @type {BroadcastZone} */
            let bz = {
                index: Number(cells.eq(0).text()),
                description: cells.eq(1).text(),
                SoundChannel: cells.eq(2).text(),
                Box: cells.eq(3).text(),
                Relay: cells.eq(4).text()
            };
            if (confirm(`Are you sure to delete broadcast zone [${bz.index}] Description=${bz.description}?`)) {
                fetchAPI(APIURL_BroadcastZone + "DeleteByIndex/" + bz.index, "DELETE", {}, null, (okdata) => {
                    reloadBroadcastZones(APIURL_BroadcastZone);
                    alert("Success delete broadcast zone: " + okdata.message);
                }, (errdata) => {
                    alert("Error delete broadcast zone: " + errdata.message);
                });
            }
        }
    });

    $btnEdit.off('click').on('click', () => {
        if (window.selectedBroadcastZoneRow) {
            let cells = window.selectedBroadcastZoneRow.find('td');
            /** @type {BroadcastZone} */
            let bz = {
                index: Number(cells.eq(0).text()),
                description: cells.eq(1).text(),
                SoundChannel: cells.eq(2).text(),
                Box: cells.eq(3).text(),
                Relay: cells.eq(4).text()
            };
            if (confirm(`Are you sure to edit broadcast zone [${bz.index}] Description=${bz.description} SoundChannel=${bz.SoundChannel} Box=${bz.id} Relay=${bz.bp}?`)) {
                $broadcastzonemodal.modal('show');
                clearBroadcastZoneModal();
                $broadcastzoneindex.val(bz.index);
                $broadcastzonedescription.val(bz.description);
                $broadcastzonesoundchannel.val(bz.SoundChannel);
                $broadcastzonebox.val(bz.Box);
                if (bz.Relay && bz.Relay.length > 0) {
                    bz.Relay.split(';').map(Number).filter(n => !isNaN(n) && n>=1 && n<=8).forEach(relayId => {
                        cbRelay(relayId).prop('checked', true);
                    });
                    
                }
                $broadcastzonemodal.off('click.broadcastzonesave').on('click.broadcastzonesave', '#broadcastzonesave', function () {
                    let description = $broadcastzonedescription.val().trim();
                    let soundChannel = $broadcastzonesoundchannel.val().trim();
                    let box = $broadcastzonebox.val().trim();
                    let relayArray = [];
                    for (let i = 1; i <= 32; i++) {
                        if (cbRelay(i).is(':checked')) {
                            relayArray.push(i);
                        }
                    }
                    let relay = relayArray.join(';');
                    if (description.length === 0) {
                        alert("Description cannot be empty");
                        return;
                    }
                    if (soundChannel.length === 0) {
                        alert("Sound Channel cannot be empty");
                        return;
                    }
                    if (box.length === 0) {
                        alert("Box cannot be empty");
                        return;
                    }
                    if (relayArray.length === 0) {
                        alert("At least one relay must be selected");
                        return;
                    }
                    let bzUpdate = {
                        description: description,
                        SoundChannel: soundChannel,
                        Box: box,
                        Relay: relay
                    };
                    fetchAPI(APIURL_BroadcastZone + "UpdateByIndex/" + bz.index, "PATCH", {}, bzUpdate, (okdata) => {
                        reloadBroadcastZones(APIURL_BroadcastZone);
                        alert("Success edit broadcast zone: " + okdata.message);
                    }, (errdata) => {
                        alert("Error edit broadcast zone: " + errdata.message);
                    });
                    $broadcastzonemodal.modal('hide');
                });
                $broadcastzonemodal.off('click.broadcastzoneclose').on('click.broadcastzoneclose', '#broadcastzoneclose', function () {
                    $broadcastzonemodal.modal('hide');
                });
            }
        }
    });

    $btnExport.off('click').on('click', () => {
        DoExport(APIURL_BroadcastZone, "broadcastzones.xlsx", {});
    });

    $btnImport.off('click').on('click', () => {
        DoImport(APIURL_BroadcastZone, (okdata) => {
            reloadBroadcastZones(APIURL_BroadcastZone);
            alert("Success import broadcast zones: " + okdata.message);
        }, (errdata) => {
            alert("Error importing broadcast zones from XLSX: " + errdata.message);
        });
    });
});