<?php
use Plugin\ItemShop\ItemShop;

function itemshopOpsEsc($value) { return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); }
function itemshopOpsSeverity($severity) {
    if($severity === 'error') return '<span class="label label-danger">Bloqueo</span>';
    if($severity === 'warning') return '<span class="label label-warning">Advertencia</span>';
    return '<span class="label label-info">Advisory</span>';
}
function itemshopOpsDate($value) {
    if(empty($value)) return '—';
    try {
        $date = new DateTimeImmutable((string)$value, new DateTimeZone('UTC'));
        return $date->setTimezone(new DateTimeZone(date_default_timezone_get()))->format('Y-m-d H:i');
    } catch(Throwable $e) { return (string)$value; }
}

$shop = new ItemShop();
if(!$shop->schemaReady()) { message('warning', 'Primero instala las tablas desde Arsenal Nexora → Configuración.'); return; }

if(($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST' && isset($_POST['rollback_bulk'])) {
    try {
        $result = $shop->rollbackBulkOperation((int)($_POST['history_id'] ?? 0));
        $text = number_format((int)$result['restored']).' configuración'.((int)$result['restored'] === 1 ? '' : 'es').' restaurada'.((int)$result['restored'] === 1 ? '' : 's').'.';
        if((int)$result['conflicts'] > 0) $text .= ' '.number_format((int)$result['conflicts']).' conflicto'.((int)$result['conflicts'] === 1 ? '' : 's').' no se sobrescribió'.((int)$result['conflicts'] === 1 ? '' : 'eron').' porque el ítem cambió después de la operación original.';
        message((int)$result['conflicts'] > 0 ? 'warning' : 'success', $text);
    } catch(Throwable $e) { message('error', itemshopOpsEsc($e->getMessage())); }
}

$opsReady = $shop->catalogOpsSchemaReady();
$readiness = $shop->catalogReadiness(300);
$history = $opsReady ? $shop->getBulkHistory(15) : array();
$total = (int)($readiness['total'] ?? 0);
$blocked = (int)($readiness['blocked'] ?? 0);
$errors = (int)($readiness['errors'] ?? 0);
$warnings = (int)($readiness['warnings'] ?? 0);
$advisories = (int)($readiness['advisories'] ?? 0);
$ready = (int)($readiness['ready'] ?? 0);
?>
<link rel="stylesheet" href="<?php echo itemshopOpsEsc(__PATH_ADMINCP_HOME__); ?>css/itemshop-admin.css?v=170">
<div id="itemshop-admin-operations">
    <h1 class="page-header">Operaciones · <?php echo itemshopOpsEsc($shop->getRealmLabel()); ?></h1>
    <div class="itemshop-admin-toolbar">
        <a href="index.php?module=itemshop&amp;page=items">← Catálogo</a>
        <a href="index.php?module=itemshop&amp;page=bulk">Carga masiva</a>
        <a href="index.php?module=itemshop&amp;page=collections">Colecciones</a>
        <a href="index.php?module=itemshop&amp;page=campaigns">Campañas</a>
        <a href="index.php?module=itemshop&amp;page=analytics">Analytics</a>
        <a href="index.php?module=itemshop&amp;page=settings">Configuración</a>
        <a href="<?php echo itemshopOpsEsc(__BASE_URL__); ?>shop/" target="_blank" rel="noopener">Abrir Arsenal público ↗</a>
    </div>

    <?php if(!$opsReady) { ?>
        <div class="alert alert-warning">
            <strong>Falta activar la capa administrativa 1.6.8.</strong> El validador puede analizar el catálogo, pero presets guardados y rollback requieren crear dos tablas administrativas. Ve a <a href="index.php?module=itemshop&amp;page=settings">Configuración</a> y pulsa <strong>Instalar / validar tablas</strong>. La compra pública continúa independiente.
        </div>
    <?php } ?>

    <div class="itemshop-readiness-hero <?php echo $blocked > 0 ? 'is-blocked' : 'is-ready'; ?>">
        <div>
            <span>Readiness del catálogo</span>
            <strong><?php echo $blocked > 0 ? 'REQUIERE CORRECCIONES' : 'LISTO PARA PUBLICACIÓN'; ?></strong>
            <small><?php echo itemshopOpsEsc($shop->getRealmLabel()); ?> · validación server-side contra catálogo técnico + Smart Options.</small>
        </div>
        <a class="btn btn-default" href="index.php?module=itemshop&amp;page=operations">Validar nuevamente</a>
    </div>

    <div class="itemshop-readiness-grid">
        <div><span>Configuraciones</span><strong><?php echo number_format($total); ?></strong><small>Total del reino</small></div>
        <div><span>Válidas</span><strong><?php echo number_format($ready); ?></strong><small>Sin bloqueos técnicos</small></div>
        <div class="<?php echo $errors ? 'is-danger' : ''; ?>"><span>Bloqueos</span><strong><?php echo number_format($errors); ?></strong><small><?php echo number_format($blocked); ?> ítems afectados</small></div>
        <div class="<?php echo $warnings ? 'is-warning' : ''; ?>"><span>Advertencias</span><strong><?php echo number_format($warnings); ?></strong><small>No impiden publicación</small></div>
        <div><span>Advisories</span><strong><?php echo number_format($advisories); ?></strong><small>Revisión operativa</small></div>
    </div>

    <div class="panel panel-default itemshop-admin-panel">
        <div class="panel-heading"><strong>Inspector del catálogo</strong><span>Errores bloquean; warnings/advisories informan sin modificar datos.</span></div>
        <div class="panel-body">
            <?php if(empty($readiness['issues'])) { ?>
                <div class="alert alert-success" style="margin-bottom:0"><strong>Sin incidencias detectadas.</strong> Las configuraciones actuales respetan la autoridad técnica de Arsenal.</div>
            <?php } else { ?>
                <div class="table-responsive">
                    <table class="table table-striped table-bordered itemshop-readiness-table">
                        <thead><tr><th>Severidad</th><th>ID</th><th>Código</th><th>Ítem</th><th>Diagnóstico</th></tr></thead>
                        <tbody>
                        <?php foreach($readiness['issues'] as $issue) { ?>
                            <tr>
                                <td><?php echo itemshopOpsSeverity((string)($issue['severity'] ?? 'advisory')); ?></td>
                                <td><?php echo (int)($issue['id'] ?? 0); ?></td>
                                <td><code><?php echo itemshopOpsEsc($issue['code'] ?? ''); ?></code></td>
                                <td><?php echo itemshopOpsEsc($issue['name'] ?? ''); ?></td>
                                <td><?php echo itemshopOpsEsc($issue['message'] ?? ''); ?></td>
                            </tr>
                        <?php } ?>
                        </tbody>
                    </table>
                </div>
                <?php if(!empty($readiness['truncated'])) { ?><p class="help-block">La vista está limitada a <?php echo number_format((int)$readiness['issue_limit']); ?> incidencias; los contadores superiores incluyen el análisis completo.</p><?php } ?>
            <?php } ?>
        </div>
    </div>

    <div class="panel panel-default itemshop-admin-panel">
        <div class="panel-heading"><strong>Rollback de operaciones masivas</strong><span>Solo restaura los campos modificados por la operación original.</span></div>
        <div class="panel-body">
            <?php if(!$opsReady) { ?>
                <p class="text-muted">Disponible después de instalar/validar la capa de operaciones 1.6.8.</p>
            <?php } elseif(count($history) < 1) { ?>
                <p class="text-muted">Todavía no hay operaciones masivas con snapshot de rollback.</p>
            <?php } else { ?>
                <div class="alert alert-info itemshop-rollback-rule"><strong>Protección de concurrencia:</strong> si una configuración fue editada después de una operación, el rollback no pisa ese cambio; la marca como conflicto y continúa con las filas que todavía coinciden.</div>
                <div class="table-responsive">
                    <table class="table table-striped table-bordered itemshop-history-table">
                        <thead><tr><th>ID</th><th>Operación</th><th>Afectados</th><th>Fecha</th><th>Estado</th><th>Acción</th></tr></thead>
                        <tbody>
                        <?php foreach($history as $row) { $rolled = !empty($row['rolled_back']); ?>
                            <tr>
                                <td>#<?php echo (int)$row['id']; ?></td>
                                <td><strong><?php echo itemshopOpsEsc($row['description'] ?? $row['action']); ?></strong><br><small><?php echo itemshopOpsEsc($row['action']); ?></small></td>
                                <td><?php echo number_format((int)$row['affected']); ?></td>
                                <td><?php echo itemshopOpsEsc(itemshopOpsDate($row['created_at'] ?? null)); ?></td>
                                <td>
                                    <?php if($rolled) { ?>
                                        <span class="label label-default">Revertida</span>
                                        <small><?php echo number_format((int)$row['rollback_count']); ?> restaurados<?php if((int)$row['conflict_count'] > 0) echo ' · '.number_format((int)$row['conflict_count']).' conflictos'; ?></small>
                                    <?php } else { ?><span class="label label-success">Rollback disponible</span><?php } ?>
                                </td>
                                <td>
                                    <?php if(!$rolled) { ?>
                                        <form method="post" onsubmit="return confirm('Revertir esta operación masiva en <?php echo itemshopOpsEsc($shop->getRealmLabel()); ?>?\n\nSolo se restaurarán filas que no hayan cambiado después de la operación original.');">
                                            <input type="hidden" name="history_id" value="<?php echo (int)$row['id']; ?>">
                                            <button class="btn btn-warning btn-xs" type="submit" name="rollback_bulk" value="1">Revertir</button>
                                        </form>
                                    <?php } else { ?>—<?php } ?>
                                </td>
                            </tr>
                        <?php } ?>
                        </tbody>
                    </table>
                </div>
            <?php } ?>
        </div>
    </div>
</div>
