(() => {
    'use strict';

    const ENDPOINT = 'alerta_global_api.php';
    const POLLING_MS = 2000;
    const SIRENES = {
        NUCLEAR: 'sirene_nuclear.wav?v=1',
        APOCALIPTICA: 'sirene_apocaliptica.wav?v=1',
        INDUSTRIAL: 'sirene_industrial.wav?v=1',
        ALERTA_VERMELHO: 'sirene_alerta_vermelho.wav?v=1',
        CYBER: 'sirene_cyber.wav?v=1'
    };

    const ESTILOS_VOZ = {
        GRAVE: {
            rate: 0.78,
            pitch: 0.55
        },

        ROBOTICA: {
            rate: 0.68,
            pitch: 0.32
        },

        COMANDO: {
            rate: 1.06,
            pitch: 0.82
        },

        PADRAO: {
            rate: 0.92,
            pitch: 0.95
        }
    };

    let alertaAtualId = 0;
    let audioContext = null;
    let masterGain = null;
    let compressor = null;
    let audioLiberado = false;
    let arquivoSirene = null;
    let somAtual = '';
    let sireneWebIntervalo = null;
    let contadorIntervalo = null;
    let sintetizouVoz = false;
    let ultimoPayload = null;
    let pollingEmExecucao = false;
    let tentativaAutomaticaEmAndamento = false;

    const style = document.createElement('style');

    style.textContent = `
        #alertaGlobalOverlay {
            position: fixed;
            inset: 0;
            z-index: 20000;
            display: none;
            place-items: center;
            padding: 22px;
            color: #fff;
            background:
                radial-gradient(circle at 50% 50%, rgba(255,255,255,.1), transparent 28rem),
                rgba(26, 0, 5, .94);
            backdrop-filter: blur(15px);
            overflow: hidden;
        }

        #alertaGlobalOverlay.show {
            display: grid;
            animation: alertaGlobalFundo .62s ease-in-out infinite alternate;
        }

        #alertaGlobalOverlay.tipo-tecnologico {
            background:
                radial-gradient(circle at 50% 50%, rgba(38,217,255,.13), transparent 28rem),
                rgba(1, 22, 38, .95);
        }

        #alertaGlobalOverlay.tipo-pegadinha {
            background:
                radial-gradient(circle at 50% 50%, rgba(179,126,255,.18), transparent 28rem),
                rgba(27, 9, 54, .95);
        }

        .alerta-global-card {
            position: relative;
            isolation: isolate;
            width: min(820px, 100%);
            overflow: hidden;
            padding: 34px;
            border: 1px solid rgba(255,255,255,.2);
            border-radius: 34px;
            text-align: center;
            background:
                radial-gradient(circle at 100% 0, rgba(255,255,255,.18), transparent 22rem),
                linear-gradient(145deg, #6e0719, #bf263d 55%, #f14962);
            box-shadow:
                0 55px 150px rgba(0,0,0,.55),
                inset 0 1px 0 rgba(255,255,255,.2);
            animation: alertaGlobalCard .65s ease-in-out infinite alternate;
        }

        .tipo-tecnologico .alerta-global-card {
            background:
                radial-gradient(circle at 100% 0, rgba(255,255,255,.16), transparent 22rem),
                linear-gradient(145deg, #05294f, #087f9c 58%, #12b5d6);
        }

        .tipo-pegadinha .alerta-global-card {
            background:
                radial-gradient(circle at 100% 0, rgba(255,255,255,.16), transparent 22rem),
                linear-gradient(145deg, #2e1b65, #6f58c7 58%, #9d82ee);
        }

        .alerta-global-card::before {
            content: "";
            position: absolute;
            z-index: -1;
            top: -210px;
            right: -160px;
            width: 480px;
            height: 480px;
            border: 55px solid rgba(255,255,255,.055);
            border-radius: 50%;
            box-shadow:
                0 0 0 58px rgba(255,255,255,.025),
                0 0 0 116px rgba(255,255,255,.013);
            animation: alertaGlobalGiro 9s linear infinite;
        }

        .alerta-global-icon {
            width: 105px;
            height: 105px;
            display: grid;
            place-items: center;
            margin: 0 auto 22px;
            border: 1px solid rgba(255,255,255,.2);
            border-radius: 34px;
            color: #7d0a1e;
            background: linear-gradient(145deg, #fff, #ffdce2);
            box-shadow:
                0 25px 55px rgba(0,0,0,.25),
                inset 0 1px 0 #fff;
            font-size: 47px;
            animation: alertaGlobalIcone .43s ease-in-out infinite alternate;
        }

        .tipo-tecnologico .alerta-global-icon {
            color: #075d72;
            background: linear-gradient(145deg, #fff, #d7f7ff);
        }

        .tipo-pegadinha .alerta-global-icon {
            color: #493592;
            background: linear-gradient(145deg, #fff, #ebe4ff);
        }

        .alerta-global-label {
            display: inline-flex;
            align-items: center;
            gap: 7px;
            margin-bottom: 12px;
            padding: 7px 11px;
            border: 1px solid rgba(255,255,255,.18);
            border-radius: 999px;
            color: rgba(255,255,255,.85);
            background: rgba(255,255,255,.1);
            font: 900 9px/1 Inter, Arial, sans-serif;
            letter-spacing: .8px;
            text-transform: uppercase;
        }

        .alerta-global-title {
            margin: 0;
            color: #fff;
            font: 950 clamp(34px, 6vw, 70px)/.95 Inter, Arial, sans-serif;
            letter-spacing: -2.4px;
            text-transform: uppercase;
        }

        .alerta-global-message {
            max-width: 660px;
            margin: 17px auto 0;
            color: rgba(255,255,255,.8);
            font: 600 13px/1.65 Inter, Arial, sans-serif;
        }

        .alerta-global-meta {
            display: flex;
            justify-content: center;
            gap: 8px;
            flex-wrap: wrap;
            margin-top: 21px;
        }

        .alerta-global-chip {
            display: inline-flex;
            align-items: center;
            gap: 6px;
            padding: 8px 10px;
            border: 1px solid rgba(255,255,255,.16);
            border-radius: 999px;
            color: rgba(255,255,255,.82);
            background: rgba(0,0,0,.12);
            font: 800 8px/1 Inter, Arial, sans-serif;
        }

        .alerta-global-countdown {
            display: block;
            margin-top: 22px;
            color: #fff;
            font: 950 30px/1 Inter, Arial, sans-serif;
            font-variant-numeric: tabular-nums;
        }

        .alerta-global-actions {
            display: flex;
            justify-content: center;
            gap: 9px;
            flex-wrap: wrap;
            margin-top: 22px;
        }

        .alerta-global-audio-status {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 7px;
            min-height: 39px;
            padding: 0 12px;
            border: 1px solid rgba(255,255,255,.16);
            border-radius: 13px;
            color: rgba(255,255,255,.8);
            background: rgba(0,0,0,.12);
            font: 850 8px/1 Inter, Arial, sans-serif;
            text-transform: uppercase;
        }

        .alerta-global-audio-status.active {
            color: #d9fff2;
            border-color: rgba(147,239,210,.28);
            background: rgba(0,100,73,.2);
        }

        .alerta-global-button {
            min-height: 46px;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 7px;
            padding: 0 15px;
            border: 1px solid rgba(255,255,255,.2);
            border-radius: 14px;
            color: #fff;
            background: rgba(255,255,255,.1);
            font: 900 9px/1 Inter, Arial, sans-serif;
            text-decoration: none;
            text-transform: uppercase;
            cursor: pointer;
        }

        .alerta-global-button.primary {
            color: #691125;
            border-color: #fff;
            background: #fff;
        }

        .tipo-tecnologico .alerta-global-button.primary {
            color: #075d72;
        }

        .tipo-pegadinha .alerta-global-button.primary {
            color: #493592;
        }

        .alerta-global-lock {
            margin-top: 17px;
            color: rgba(255,255,255,.65);
            font: 700 8px/1.5 Inter, Arial, sans-serif;
        }

        @keyframes alertaGlobalFundo {
            from { filter: brightness(.9); }
            to { filter: brightness(1.18); }
        }

        @keyframes alertaGlobalCard {
            from { transform: scale(.992); }
            to { transform: scale(1.008); }
        }

        @keyframes alertaGlobalIcone {
            from { transform: rotate(-4deg) scale(.98); }
            to { transform: rotate(4deg) scale(1.05); }
        }

        @keyframes alertaGlobalGiro {
            to { transform: rotate(360deg); }
        }

        @media (max-width: 640px) {
            #alertaGlobalOverlay { padding: 10px; }

            .alerta-global-card {
                padding: 27px 18px;
                border-radius: 26px;
            }

            .alerta-global-icon {
                width: 82px;
                height: 82px;
                border-radius: 27px;
                font-size: 37px;
            }

            .alerta-global-actions {
                display: grid;
                grid-template-columns: 1fr;
            }

            .alerta-global-button { width: 100%; }
        }

        @media print {
            #alertaGlobalOverlay { display: none !important; }
        }
    `;

    document.head.appendChild(style);

    const overlay = document.createElement('div');

    overlay.id = 'alertaGlobalOverlay';

    overlay.innerHTML = `
        <article class="alerta-global-card">
            <div class="alerta-global-icon">
                <i class="bi bi-broadcast-pin" id="alertaGlobalIcon"></i>
            </div>

            <span class="alerta-global-label">
                <i class="bi bi-shield-lock-fill"></i>
                Alerta global da Gerência de Tecnologia
            </span>

            <h2 class="alerta-global-title" id="alertaGlobalTitle">
                Alerta ativo
            </h2>

            <p class="alerta-global-message" id="alertaGlobalMessage">
                Aguarde o administrador encerrar o alerta.
            </p>

            <div class="alerta-global-meta">
                <span class="alerta-global-chip">
                    <i class="bi bi-person-fill"></i>
                    Disparado por
                    <strong id="alertaGlobalAuthor">Administrador</strong>
                </span>

                <span class="alerta-global-chip">
                    <i class="bi bi-wifi"></i>
                    <strong id="alertaGlobalReached">1</strong>
                    tela(s) conectada(s)
                </span>

                <span class="alerta-global-chip">
                    <i class="bi bi-volume-up-fill"></i>
                    <strong id="alertaGlobalSound">NUCLEAR</strong>
                </span>

                <span class="alerta-global-chip">
                    <i class="bi bi-mic-fill"></i>
                    <strong id="alertaGlobalVoice">GRAVE</strong>
                </span>
            </div>

            <strong class="alerta-global-countdown" id="alertaGlobalCountdown">
                00:30
            </strong>

            <div class="alerta-global-actions">
                <span
                    class="alerta-global-audio-status"
                    id="alertaGlobalAudioStatus"
                >
                    <i class="bi bi-volume-up-fill"></i>
                    Sirene automática
                </span>

                <a
                    href="alerta_global_admin.php"
                    class="alerta-global-button"
                    id="alertaGlobalAdminLink"
                    style="display:none;"
                >
                    <i class="bi bi-shield-lock-fill"></i>
                    Abrir controle administrativo
                </a>
            </div>

            <div class="alerta-global-lock">
                <i class="bi bi-lock-fill"></i>
                Este aviso permanece ativo até o administrador desarmar
                ou até o limite de segurança expirar.
            </div>
        </article>
    `;

    document.body.appendChild(overlay);

    const title = document.getElementById('alertaGlobalTitle');
    const message = document.getElementById('alertaGlobalMessage');
    const author = document.getElementById('alertaGlobalAuthor');
    const reached = document.getElementById('alertaGlobalReached');
    const soundName = document.getElementById('alertaGlobalSound');
    const voiceName = document.getElementById('alertaGlobalVoice');
    const countdown = document.getElementById('alertaGlobalCountdown');
    const icon = document.getElementById('alertaGlobalIcon');
    const adminLink = document.getElementById('alertaGlobalAdminLink');
    const audioStatus = document.getElementById('alertaGlobalAudioStatus');

    function paginaAtual() {
        return `${location.pathname}${location.search}`.slice(0, 220);
    }

    function normalizarSom(som) {
        const valor = String(som || 'NUCLEAR').toUpperCase();

        return Object.prototype.hasOwnProperty.call(
            SIRENES,
            valor
        )
            ? valor
            : 'NUCLEAR';
    }

    function prepararArquivoSirene(som = 'NUCLEAR') {
        const selecionado = normalizarSom(som);

        if (
            arquivoSirene &&
            somAtual === selecionado
        ) {
            return arquivoSirene;
        }

        if (arquivoSirene) {
            arquivoSirene.pause();
            arquivoSirene.currentTime = 0;
        }

        somAtual = selecionado;

        arquivoSirene = new Audio(
            SIRENES[selecionado]
        );

        arquivoSirene.loop = true;
        arquivoSirene.preload = 'auto';
        arquivoSirene.volume = 1;
        arquivoSirene.playsInline = true;

        arquivoSirene.addEventListener('playing', () => {
            audioLiberado = true;
            atualizarStatusAudio(true);
        });

        arquivoSirene.addEventListener('error', () => {
            atualizarStatusAudio(false);
        });

        arquivoSirene.load();

        return arquivoSirene;
    }

    function atualizarStatusAudio(ativo) {
        if (!audioStatus) {
            return;
        }

        audioStatus.classList.toggle('active', ativo);

        audioStatus.innerHTML = ativo
            ? `
                <i class="bi bi-volume-up-fill"></i>
                Sirene automática ativa
              `
            : `
                <i class="bi bi-volume-mute-fill"></i>
                Autoplay bloqueado pelo navegador
              `;
    }

    async function prepararWebAudio() {
        try {
            const AudioContextClass =
                window.AudioContext ||
                window.webkitAudioContext;

            if (!AudioContextClass) {
                return false;
            }

            if (!audioContext) {
                audioContext = new AudioContextClass();

                compressor = audioContext.createDynamicsCompressor();
                compressor.threshold.value = -18;
                compressor.knee.value = 16;
                compressor.ratio.value = 7;
                compressor.attack.value = 0.004;
                compressor.release.value = 0.18;

                masterGain = audioContext.createGain();
                masterGain.gain.value = 1.18;

                masterGain.connect(compressor);
                compressor.connect(audioContext.destination);
            }

            if (audioContext.state === 'suspended') {
                await audioContext.resume();
            }

            return audioContext.state === 'running';
        } catch {
            return false;
        }
    }

    async function tentarAutoplayAutomatico(som = 'NUCLEAR') {
        if (tentativaAutomaticaEmAndamento) {
            return audioLiberado;
        }

        tentativaAutomaticaEmAndamento = true;

        try {
            const audio = prepararArquivoSirene(som);

            audio.currentTime = 0;
            audio.volume = 1;
            audio.muted = false;

            const promise = audio.play();

            if (promise && typeof promise.then === 'function') {
                await promise;
            }

            audioLiberado = !audio.paused;
            atualizarStatusAudio(audioLiberado);

            if (audioLiberado) {
                await prepararWebAudio();
            }

            return audioLiberado;
        } catch {
            audioLiberado = false;
            atualizarStatusAudio(false);
            return false;
        } finally {
            tentativaAutomaticaEmAndamento = false;
        }
    }

    async function armarAudioNaInteracao() {
        const audio = prepararArquivoSirene(
            ultimoPayload?.som || 'NUCLEAR'
        );

        try {
            audio.volume = 0.001;
            audio.muted = false;
            audio.currentTime = 0;

            await audio.play();

            await prepararWebAudio();

            window.setTimeout(() => {
                audio.pause();
                audio.currentTime = 0;
                audio.volume = 1;
            }, 120);

            audioLiberado = true;
            atualizarStatusAudio(true);

            if (alertaAtualId > 0) {
                iniciarSireneCompleta(ultimoPayload);

                if (ultimoPayload) {
                    falarAlerta(ultimoPayload);
                }
            }

            return true;
        } catch {
            audioLiberado = false;
            atualizarStatusAudio(false);
            return false;
        }
    }

    function criarTom(
        inicio,
        duracao,
        tipo,
        frequenciaA,
        frequenciaB,
        volume
    ) {
        if (
            !audioContext ||
            !masterGain ||
            audioContext.state !== 'running'
        ) {
            return;
        }

        const oscilador = audioContext.createOscillator();
        const ganho = audioContext.createGain();

        oscilador.type = tipo;

        oscilador.frequency.setValueAtTime(
            frequenciaA,
            inicio
        );

        oscilador.frequency.exponentialRampToValueAtTime(
            Math.max(1, frequenciaB),
            inicio + duracao
        );

        ganho.gain.setValueAtTime(0.0001, inicio);
        ganho.gain.exponentialRampToValueAtTime(
            volume,
            inicio + 0.035
        );
        ganho.gain.setValueAtTime(
            volume,
            inicio + duracao - 0.08
        );
        ganho.gain.exponentialRampToValueAtTime(
            0.0001,
            inicio + duracao
        );

        oscilador.connect(ganho);
        ganho.connect(masterGain);

        oscilador.start(inicio);
        oscilador.stop(inicio + duracao + 0.03);
    }

    function rajadaWebAudio() {
        if (
            !audioContext ||
            audioContext.state !== 'running'
        ) {
            return;
        }

        const inicio = audioContext.currentTime + 0.025;

        for (let i = 0; i < 4; i++) {
            const base = inicio + i * 0.74;
            const subida = i % 2 === 0;

            criarTom(
                base,
                0.69,
                'sawtooth',
                subida ? 360 : 1220,
                subida ? 1220 : 360,
                0.17
            );

            criarTom(
                base + 0.018,
                0.66,
                'square',
                subida ? 540 : 920,
                subida ? 920 : 540,
                0.075
            );

            criarTom(
                base + 0.045,
                0.61,
                'triangle',
                subida ? 170 : 255,
                subida ? 255 : 170,
                0.09
            );
        }
    }

    async function iniciarSireneCompleta(
        payload = ultimoPayload
    ) {
        const som = payload?.som || 'NUCLEAR';

        const tocou = await tentarAutoplayAutomatico(som);

        const webAudioAtivo = await prepararWebAudio();

        if (webAudioAtivo && !sireneWebIntervalo) {
            rajadaWebAudio();

            sireneWebIntervalo = window.setInterval(
                rajadaWebAudio,
                3100
            );
        }

        if (!tocou && audioLiberado) {
            const audio = prepararArquivoSirene(som);

            try {
                audio.currentTime = 0;
                audio.volume = 1;
                await audio.play();
            } catch {
            }
        }
    }

    function pararSirene() {
        if (arquivoSirene) {
            arquivoSirene.pause();
            arquivoSirene.currentTime = 0;
        }

        if (sireneWebIntervalo) {
            window.clearInterval(sireneWebIntervalo);
            sireneWebIntervalo = null;
        }

        if ('speechSynthesis' in window) {
            try {
                speechSynthesis.cancel();
            } catch {
            }
        }

        sintetizouVoz = false;
    }

    function falarAlerta(payload) {
        if (
            sintetizouVoz ||
            !audioLiberado ||
            !('speechSynthesis' in window)
        ) {
            return;
        }

        sintetizouVoz = true;

        window.setTimeout(() => {
            try {
                const texto = String(
                    payload.frase_falada ||
                    `${payload.titulo}. ${payload.mensagem}`
                ).trim();

                if (!texto) {
                    return;
                }

                const estilo = String(
                    payload.voz_estilo || 'GRAVE'
                ).toUpperCase();

                const config =
                    ESTILOS_VOZ[estilo] ||
                    ESTILOS_VOZ.GRAVE;

                const fala =
                    new SpeechSynthesisUtterance(texto);

                fala.lang = 'pt-BR';
                fala.rate = config.rate;
                fala.pitch = config.pitch;
                fala.volume = 1;

                const vozes =
                    speechSynthesis.getVoices();

                const vozPt = vozes.find(voz => {
                    return String(voz.lang || '')
                        .toLowerCase()
                        .startsWith('pt-br');
                }) || vozes.find(voz => {
                    return String(voz.lang || '')
                        .toLowerCase()
                        .startsWith('pt');
                });

                if (vozPt) {
                    fala.voice = vozPt;
                }

                speechSynthesis.cancel();
                speechSynthesis.speak(fala);
            } catch {
            }
        }, 1900);
    }

    function classeTipo(tipo) {
        const valor = String(tipo || '').toUpperCase();

        if (valor === 'TECNOLOGICO') {
            return 'tipo-tecnologico';
        }

        if (valor === 'PEGADINHA') {
            return 'tipo-pegadinha';
        }

        return '';
    }

    function iconeTipo(tipo) {
        const valor = String(tipo || '').toUpperCase();

        if (valor === 'TECNOLOGICO') {
            return 'bi-cpu-fill';
        }

        if (valor === 'PEGADINHA') {
            return 'bi-emoji-laughing-fill';
        }

        if (valor === 'URGENTE') {
            return 'bi-exclamation-triangle-fill';
        }

        return 'bi-broadcast-pin';
    }

    function formatarContagem(segundos) {
        const total = Math.max(
            0,
            Math.floor(Number(segundos) || 0)
        );

        const minutos = Math.floor(total / 60);
        const resto = total % 60;

        return `${String(minutos).padStart(2, '0')}:` +
            `${String(resto).padStart(2, '0')}`;
    }

    function iniciarContador(segundos) {
        if (contadorIntervalo) {
            window.clearInterval(contadorIntervalo);
        }

        let restante = Math.max(
            0,
            Number(segundos) || 0
        );

        if (countdown) {
            countdown.textContent =
                formatarContagem(restante);
        }

        contadorIntervalo = window.setInterval(() => {
            restante = Math.max(0, restante - 1);

            if (countdown) {
                countdown.textContent =
                    formatarContagem(restante);
            }
        }, 1000);
    }

    function mostrarAlerta(payload, admin) {
        ultimoPayload = payload;

        const novoId = Number(payload.id || 0);

        if (alertaAtualId !== novoId) {
            alertaAtualId = novoId;
            sintetizouVoz = false;
        }

        overlay.className = classeTipo(payload.tipo);
        overlay.id = 'alertaGlobalOverlay';
        overlay.classList.add('show');

        if (title) {
            title.textContent =
                payload.titulo || 'Alerta global';
        }

        if (message) {
            message.textContent =
                payload.mensagem ||
                'Aguarde o administrador encerrar o alerta.';
        }

        if (author) {
            author.textContent =
                payload.criado_por || 'Administrador';
        }

        if (reached) {
            reached.textContent =
                String(payload.alcancados || 1);
        }

        if (soundName) {
            soundName.textContent = String(
                payload.som || 'NUCLEAR'
            ).replaceAll('_', ' ');
        }

        if (voiceName) {
            voiceName.textContent = String(
                payload.voz_estilo || 'GRAVE'
            ).replaceAll('_', ' ');
        }

        if (icon) {
            icon.className =
                `bi ${iconeTipo(payload.tipo)}`;
        }

        if (adminLink) {
            adminLink.style.display =
                admin ? 'inline-flex' : 'none';
        }

        iniciarContador(payload.segundos_restantes);

        iniciarSireneCompleta(payload).then(() => {
            falarAlerta(payload);
        });
    }

    function esconderAlerta() {
        alertaAtualId = 0;
        ultimoPayload = null;

        overlay.classList.remove('show');

        if (contadorIntervalo) {
            window.clearInterval(contadorIntervalo);
            contadorIntervalo = null;
        }

        pararSirene();
    }

    async function consultarStatus() {
        if (pollingEmExecucao) {
            return;
        }

        pollingEmExecucao = true;

        try {
            const url = new URL(
                ENDPOINT,
                window.location.href
            );

            url.searchParams.set('acao', 'status');
            url.searchParams.set('pagina', paginaAtual());
            url.searchParams.set('_', String(Date.now()));

            const resposta = await fetch(
                url.toString(),
                {
                    credentials: 'same-origin',
                    cache: 'no-store',
                    headers: {
                        'X-Requested-With':
                            'XMLHttpRequest'
                    }
                }
            );

            const dados = await resposta
                .json()
                .catch(() => ({}));

            if (!resposta.ok || dados.ok === false) {
                return;
            }

            if (!dados.ativo || !dados.alerta) {
                esconderAlerta();
                return;
            }

            mostrarAlerta(
                dados.alerta,
                Boolean(dados.admin)
            );
        } catch {
        } finally {
            pollingEmExecucao = false;
        }
    }

    /*
     * Tenta armar automaticamente. Com política de autoplay aplicada no
     * navegador, isso já basta. Sem política, a primeira interação normal
     * com o sistema arma o áudio sem mostrar pergunta ao usuário.
     */
    prepararArquivoSirene('NUCLEAR');
    tentarAutoplayAutomatico().then(tocou => {
        if (tocou) {
            pararSirene();
            audioLiberado = true;
            atualizarStatusAudio(true);
        }
    });

    const primeiraInteracao = async () => {
        await armarAudioNaInteracao();

        window.removeEventListener(
            'pointerdown',
            primeiraInteracao,
            true
        );

        window.removeEventListener(
            'keydown',
            primeiraInteracao,
            true
        );
    };

    window.addEventListener(
        'pointerdown',
        primeiraInteracao,
        true
    );

    window.addEventListener(
        'keydown',
        primeiraInteracao,
        true
    );

    document.addEventListener(
        'visibilitychange',
        () => {
            if (!document.hidden) {
                consultarStatus();

                if (alertaAtualId > 0) {
                    iniciarSireneCompleta(ultimoPayload);
                }
            }
        }
    );

    consultarStatus();

    window.setInterval(
        consultarStatus,
        POLLING_MS
    );
})();
