<?php

/**
 * Hyvä Themes - https://hyva.io
 * Copyright © Hyvä Themes. All rights reserved.
 * See COPYING.txt for license details.
 */

declare(strict_types=1);

use Hyva\Minification\Block\Adminhtml\System\Config\DaemonStatus;
use Magento\Framework\Escaper;
use Magento\Framework\View\Helper\SecureHtmlRenderer;

/** @var DaemonStatus $block */
/** @var Escaper $escaper */
/** @var SecureHtmlRenderer $secureRenderer */

$statusUrl = $block->getData('status_url');
$restartUrl = $block->getData('restart_url');
$startUrl = $block->getData('start_url');
?>
<div id="hyva-minification-daemon-status">
    <table class="hyva-daemon-status-table" cellspacing="0" cellpadding="4">
        <tr>
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('Status')) ?>:</strong></td>
            <td id="hyva-daemon-val-status"></td>
        </tr>
        <tr>
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('PID')) ?>:</strong></td>
            <td id="hyva-daemon-val-pid"></td>
        </tr>
        <tr id="hyva-daemon-row-started">
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('Last Started')) ?>:</strong></td>
            <td id="hyva-daemon-val-started"></td>
        </tr>
        <tr>
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('Log File')) ?>:</strong></td>
            <td id="hyva-daemon-val-log"></td>
        </tr>
        <tr id="hyva-daemon-row-lastlog">
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('Last Log Entry')) ?>:</strong></td>
            <td><div id="hyva-daemon-val-lastlog" style="min-height: 2.8em;"></div></td>
        </tr>
        <tr>
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('Daemon Management')) ?>:</strong></td>
            <td id="hyva-daemon-val-management"></td>
        </tr>
        <tr>
            <td style="white-space: nowrap;"><strong><?= $escaper->escapeHtml(__('Shutdown Signal')) ?>:</strong></td>
            <td id="hyva-daemon-val-pill"></td>
        </tr>
    </table>
    <div style="margin-top: 10px; display: flex; align-items: center; gap: 10px;">
        <button id="hyva-minification-daemon-btn"
                type="button"
                class="action-default scalable"
                style="flex-shrink: 0; visibility: hidden;">
            <span>&nbsp;</span>
        </button>
        <span id="hyva-minification-daemon-result"></span>
        <span id="hyva-minification-daemon-spinner" style="display: none;">
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none"
                 stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                <path d="M21 12a9 9 0 1 1-6.219-8.56">
                    <animateTransform attributeName="transform" type="rotate"
                                      from="0 12 12" to="360 12 12" dur="1s" repeatCount="indefinite"/>
                </path>
            </svg>
        </span>
    </div>
</div>
<?php /* Output buffering is used here instead of a HEREDOC for compatibility with core PHP-based HTML minification. */ ?>
<?php ob_start(); ?>
    (function() {
        var statusUrl = '<?= $escaper->escapeJs($statusUrl) ?>';
        var restartUrl = '<?= $escaper->escapeJs($restartUrl) ?>';
        var startUrl = '<?= $escaper->escapeJs($startUrl) ?>';

        var btn = document.getElementById('hyva-minification-daemon-btn');
        var resultSpan = document.getElementById('hyva-minification-daemon-result');
        var spinner = document.getElementById('hyva-minification-daemon-spinner');

        var currentAction = null; // 'start', 'restart', or 'stop'

        function updateStatusDisplay(data) {
            var isHealthy = data.is_healthy;
            var daemonManagement = data.daemon_management || 'off';
            var isManaged = daemonManagement !== 'off';
            var state = data.daemon_state;

            // Status
            var statusCell = document.getElementById('hyva-daemon-val-status');
            if (isHealthy) {
                statusCell.innerHTML = '<span style="color: #2ea553; font-weight: bold;">&#x25CF; Running</span>';
            } else {
                statusCell.innerHTML = '<span style="color: #e22626; font-weight: bold;">&#x25CF; Not Running</span>';
            }

            // Daemon management
            var mgmtCell = document.getElementById('hyva-daemon-val-management');
            var mgmtLabels = {cron: 'Cron', on_demand: 'Start on-demand', off: 'Off'};
            if (isManaged) {
                mgmtCell.innerHTML = '<span style="color: #2ea553;">' + escapeHtml(mgmtLabels[daemonManagement] || daemonManagement) + '</span>';
            } else {
                mgmtCell.innerHTML = '<span style="color: #999;">Off</span>';
            }

            // PID
            var pidCell = document.getElementById('hyva-daemon-val-pid');
            if (state && isHealthy) {
                pidCell.textContent = state.pid;
            } else if (isHealthy) {
                pidCell.innerHTML = '<span style="color: #999;">Unknown</span>';
            } else {
                pidCell.innerHTML = '<span style="color: #999;">None</span>';
            }

            // Last started
            var startedCell = document.getElementById('hyva-daemon-val-started');
            if (state) {
                startedCell.textContent = state.started_at;
            } else {
                startedCell.innerHTML = '<span style="color: #999;">\u2014</span>';
            }

            // Log file
            var logCell = document.getElementById('hyva-daemon-val-log');
            var logHtml = '<code style="font-size: 0.9em;">' + escapeHtml(data.log_path) + '</code> ';
            if (data.formatted_log_size !== null) {
                logHtml += '(' + escapeHtml(data.formatted_log_size) + ')';
            } else {
                logHtml += '<span style="color: #999;">(not yet created)</span>';
            }
            logCell.innerHTML = logHtml;

            // Last log line
            var lastLogCell = document.getElementById('hyva-daemon-val-lastlog');
            if (data.last_log_line) {
                lastLogCell.innerHTML =
                    '<code style="font-size: 0.9em;">' + escapeHtml(data.last_log_line) + '</code>';
            } else {
                lastLogCell.innerHTML = '<span style="color: #999;">\u2014</span>';
            }

            // Poison pill
            var pillCell = document.getElementById('hyva-daemon-val-pill');
            if (data.poison_pill_present) {
                var pillPath = data.poison_pill_path || 'var/hyva_minifier_shutdown.flag';
                pillCell.innerHTML = '<code style="font-size: 0.9em; color: #e68a00;">' + escapeHtml(pillPath + ' exists') + '</code>';
            } else {
                pillCell.innerHTML = '<span style="color: #999;">None</span>';
            }

            // Permission warning
            var container = document.getElementById('hyva-minification-daemon-status');
            var warningDiv = document.getElementById('hyva-daemon-permission-warning');
            if (data.non_writable_files && data.non_writable_files.length > 0) {
                if (!warningDiv) {
                    warningDiv = document.createElement('div');
                    warningDiv.id = 'hyva-daemon-permission-warning';
                    warningDiv.style.cssText = 'margin-top: 10px; padding: 10px 14px; background: #fff0f0; border: 1px solid #e22626; border-radius: 4px; color: #e22626;';
                    container.querySelector('table').after(warningDiv);
                }
                var fileList = data.non_writable_files.map(function(f) { return '<code>' + escapeHtml(f) + '</code>'; }).join(', ');
                var explanation = daemonManagement === 'cron'
                    ? 'The Cron Daemon Manager requires that both the web server and the cron process can read and write ' +
                      'to the same files in <code>var/</code>. ' +
                      'Please check the <em>Cron Daemon Manager</em> section in the module README for details.'
                    : 'The web server has to be able to read and write these files.';
                warningDiv.innerHTML = '<strong>&#x26A0; File Permission Issue</strong><br>' +
                    'The following file(s) are not writable by the web server user: ' + fileList + '.<br>' +
                    explanation;
            } else if (warningDiv) {
                warningDiv.remove();
            }

            // Button
            if (!isHealthy) {
                currentAction = 'start';
                btn.querySelector('span').textContent = 'Start Daemon';
                btn.title = 'Start Daemon';
            } else if (isManaged) {
                currentAction = 'restart';
                btn.querySelector('span').textContent = 'Restart Daemon';
                btn.title = 'Restart Daemon';
            } else {
                currentAction = 'stop';
                btn.querySelector('span').textContent = 'Stop Daemon';
                btn.title = 'Stop Daemon';
            }
            btn.style.visibility = 'visible';
        }

        function escapeHtml(str) {
            var div = document.createElement('div');
            div.appendChild(document.createTextNode(str));
            return div.innerHTML;
        }

        function fetchStatus(callback) {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', statusUrl);
            xhr.onload = function() {
                try {
                    updateStatusDisplay(JSON.parse(xhr.responseText));
                } catch(e) {
                    document.getElementById('hyva-daemon-val-status').innerHTML =
                        '<span style="color: #e22626;">Failed to load status</span>';
                }
                if (callback) callback();
            };
            xhr.onerror = function() {
                document.getElementById('hyva-daemon-val-status').innerHTML =
                    '<span style="color: #e22626;">Failed to load status</span>';
                if (callback) callback();
            };
            xhr.send();
        }

        btn.addEventListener('click', function() {
            var confirmMessages = {
                restart: 'Send restart signal to the daemon? It will shut down within a few seconds and be restarted automatically.',
                stop: 'Stop the daemon?'
            };
            if (currentAction !== 'start' && !confirm(confirmMessages[currentAction] || 'Proceed?')) {
                return;
            }

            var url = (currentAction === 'start') ? startUrl : restartUrl;
            var label = btn.querySelector('span').textContent;

            btn.disabled = true;
            btn.querySelector('span').textContent = 'Please wait...';
            resultSpan.textContent = '';

            var xhr = new XMLHttpRequest();
            xhr.open('POST', url);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.onload = function() {
                try {
                    var data = JSON.parse(xhr.responseText);
                    if (data.success) {
                        if (currentAction !== 'start') {
                            var pillCell = document.getElementById('hyva-daemon-val-pill');
                            pillCell.innerHTML = '<code style="font-size: 0.9em; color: #e68a00;">var/hyva_minifier_shutdown.flag exists</code>';
                        }
                        spinner.style.display = '';
                        setTimeout(function() {
                            fetchStatus(function() {
                                spinner.style.display = 'none';
                                btn.disabled = false;
                            });
                        }, 5000);
                    } else {
                        btn.disabled = false;
                        btn.querySelector('span').textContent = label;
                        resultSpan.textContent = data.message || 'Failed';
                        resultSpan.style.color = '#e22626';
                    }
                } catch(e) {
                    btn.disabled = false;
                    btn.querySelector('span').textContent = label;
                    resultSpan.textContent = 'Unexpected response';
                    resultSpan.style.color = '#e22626';
                }
            };
            xhr.onerror = function() {
                btn.disabled = false;
                btn.querySelector('span').textContent = label;
                resultSpan.textContent = 'Request failed';
                resultSpan.style.color = '#e22626';
            };
            xhr.send('form_key=' + encodeURIComponent(FORM_KEY));
        });

        fetchStatus();
    })();
<?php $daemonStatusScript = ob_get_clean(); ?>
<?= /* @noEscape */ $secureRenderer->renderTag('script', [], $daemonStatusScript, false) ?>
