<?php
declare(strict_types=1);

require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/conexao.php';
require_once __DIR__ . '/impressoras_helpers.php';

date_default_timezone_set('America/Sao_Paulo');
impressorasExigirAcesso();

$mysqli->set_charset('utf8mb4');
$flash = impConsumirFlash();

$q = impTexto($_GET['q'] ?? '', 150);
$statusFiltro = impTexto($_GET['status'] ?? '', 40);
$setorFiltro = (int) ($_GET['setor_id'] ?? 0);
$tipoFiltro = impTexto($_GET['tipo'] ?? '', 40);
$pagina = max(1, (int) ($_GET['pagina'] ?? 1));
$porPagina = 50;
$offset = ($pagina - 1) * $porPagina;

$where = ['1=1'];
$tipos = '';
$valores = [];

if ($q !== '') {
    $where[] = "(
        i.codigo_interno LIKE ?
        OR i.patrimonio LIKE ?
        OR i.numero_serie LIKE ?
        OR i.marca LIKE ?
        OR i.modelo LIKE ?
        OR i.ip LIKE ?
        OR i.nome_rede LIKE ?
        OR i.responsavel_nome LIKE ?
        OR s.nome LIKE ?
        OR a.nome LIKE ?
    )";

    $termo = '%' . $q . '%';

    for ($x = 0; $x < 10; $x++) {
        $tipos .= 's';
        $valores[] = $termo;
    }
}

if ($statusFiltro !== '') {
    $where[] = 'i.status = ?';
    $tipos .= 's';
    $valores[] = $statusFiltro;
}

if ($setorFiltro > 0) {
    $where[] = 'i.setor_id = ?';
    $tipos .= 'i';
    $valores[] = $setorFiltro;
}

if ($tipoFiltro !== '') {
    $where[] = 'i.tipo = ?';
    $tipos .= 's';
    $valores[] = $tipoFiltro;
}

$whereSql = implode(' AND ', $where);

if (($_GET['export'] ?? '') === 'csv') {
    $sqlExportacao = "
        SELECT
            i.codigo_interno,
            i.tipo,
            i.patrimonio,
            i.numero_serie,
            i.marca,
            i.modelo,
            i.ip,
            i.mac,
            i.nome_rede,
            i.toner_modelo,
            i.status,
            i.responsavel_nome,
            i.responsavel_matricula,
            s.nome AS setor_nome,
            s.secretaria,
            s.predio,
            a.nome AS ambiente_nome,
            i.localizacao_texto,
            i.local_atual,
            i.contador_paginas,
            i.atualizado_em
        FROM ti_impressoras AS i
        LEFT JOIN ti_setores AS s ON s.id = i.setor_id
        LEFT JOIN ti_ambientes AS a ON a.id = i.ambiente_id
        WHERE {$whereSql}
        ORDER BY i.marca,i.modelo,i.patrimonio
    ";

    $stmtExportacao = impExecutar(
        $mysqli,
        $sqlExportacao,
        $valores
    );

    header('Content-Type: text/csv; charset=UTF-8');
    header(
        'Content-Disposition: attachment; filename="impressoras_' .
        date('Y-m-d_H-i') .
        '.csv"'
    );

    echo "\xEF\xBB\xBF";

    $arquivoCsv = fopen('php://output', 'wb');

    fputcsv($arquivoCsv, [
        'Código','Tipo','Patrimônio','Número de série','Marca','Modelo',
        'IP','MAC','Nome na rede','Toner','Status','Responsável','Matrícula',
        'Setor','Secretaria','Prédio','Ambiente','Posição','Local atual',
        'Contador','Atualizado em'
    ], ';');

    $resultadoExportacao = $stmtExportacao->get_result();

    while ($linhaExportacao = $resultadoExportacao->fetch_assoc()) {
        fputcsv($arquivoCsv, array_values($linhaExportacao), ';');
    }

    $stmtExportacao->close();
    fclose($arquivoCsv);
    exit;
}

$urlExportacao = '?' . http_build_query([
    'q' => $q,
    'status' => $statusFiltro,
    'setor_id' => $setorFiltro,
    'tipo' => $tipoFiltro,
    'export' => 'csv'
]);

$sqlTotal = "
    SELECT COUNT(*) AS total
    FROM ti_impressoras AS i
    LEFT JOIN ti_setores AS s ON s.id = i.setor_id
    LEFT JOIN ti_ambientes AS a ON a.id = i.ambiente_id
    WHERE {$whereSql}
";

$stmt = $mysqli->prepare($sqlTotal);

if ($tipos !== '') {
    $referenciasTotal = [];

    foreach ($valores as $indice => $valor) {
        $referenciasTotal[$indice] = &$valores[$indice];
    }

    $stmt->bind_param($tipos, ...$referenciasTotal);
}

$stmt->execute();
$totalFiltrado = (int) (
    $stmt->get_result()->fetch_assoc()['total'] ?? 0
);
$stmt->close();

$sql = "
    SELECT
        i.*,
        s.nome AS setor_nome,
        s.secretaria AS setor_secretaria,
        s.predio AS setor_predio,
        a.nome AS ambiente_nome,
        m.id AS manutencao_id,
        m.numero_atendimento,
        m.status AS manutencao_status,
        m.data_entrada AS manutencao_entrada
    FROM ti_impressoras AS i
    LEFT JOIN ti_setores AS s ON s.id = i.setor_id
    LEFT JOIN ti_ambientes AS a ON a.id = i.ambiente_id
    LEFT JOIN ti_impressora_manutencoes AS m
        ON m.id = (
            SELECT mm.id
            FROM ti_impressora_manutencoes AS mm
            WHERE mm.impressora_id = i.id
              AND mm.status NOT IN ('RETIRADA', 'CANCELADA')
            ORDER BY mm.id DESC
            LIMIT 1
        )
    WHERE {$whereSql}
    ORDER BY
        FIELD(
            i.status,
            'PRONTA_RETIRADA',
            'AGUARDANDO_DIAGNOSTICO',
            'EM_MANUTENCAO',
            'AGUARDANDO_PECA',
            'AGUARDANDO_TONER',
            'ASSISTENCIA_EXTERNA',
            'NAO_LOCALIZADA',
            'EM_USO',
            'ESTOQUE_RESERVA',
            'AGUARDANDO_BAIXA',
            'BAIXADA',
            'CADASTRO_INICIAL'
        ),
        i.atualizado_em DESC
    LIMIT ? OFFSET ?
";

$stmt = $mysqli->prepare($sql);
$tiposLista = $tipos . 'ii';
$valoresLista = [...$valores, $porPagina, $offset];
$referenciasLista = [];

foreach ($valoresLista as $indice => $valor) {
    $referenciasLista[$indice] = &$valoresLista[$indice];
}

$stmt->bind_param($tiposLista, ...$referenciasLista);
$stmt->execute();

$impressoras = [];
$resultado = $stmt->get_result();

while ($linha = $resultado->fetch_assoc()) {
    $impressoras[] = $linha;
}

$stmt->close();

$kpis = [
    'total'=>0,
    'em_uso'=>0,
    'manutencao'=>0,
    'prontas'=>0,
    'estoque'=>0,
    'problemas'=>0
];

$resultado = $mysqli->query("
    SELECT
        COUNT(*) AS total,
        COALESCE(SUM(status = 'EM_USO'), 0) AS em_uso,
        COALESCE(SUM(status IN (
            'AGUARDANDO_DIAGNOSTICO',
            'EM_MANUTENCAO',
            'AGUARDANDO_PECA',
            'AGUARDANDO_TONER',
            'ASSISTENCIA_EXTERNA'
        )), 0) AS manutencao,
        COALESCE(SUM(status = 'PRONTA_RETIRADA'), 0) AS prontas,
        COALESCE(SUM(status = 'ESTOQUE_RESERVA'), 0) AS estoque,
        COALESCE(SUM(status IN (
            'NAO_LOCALIZADA',
            'AGUARDANDO_BAIXA'
        )), 0) AS problemas
    FROM ti_impressoras
");

if ($resultado) {
    $linha = $resultado->fetch_assoc() ?: [];

    foreach ($kpis as $chave => $valor) {
        $kpis[$chave] = (int) ($linha[$chave] ?? 0);
    }
}

$setores = [];
$resultado = $mysqli->query("
    SELECT id, nome, predio
    FROM ti_setores
    WHERE ativo = 1
    ORDER BY nome
");

if ($resultado) {
    while ($linha = $resultado->fetch_assoc()) {
        $setores[] = $linha;
    }
}

$totalPaginas = max(1, (int) ceil($totalFiltrado / $porPagina));

function impQueryPagina(int $pagina): string
{
    $dados = $_GET;
    $dados['pagina'] = $pagina;
    return '?' . http_build_query($dados);
}
?>
<!doctype html>
<html lang="pt-BR">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
    <meta name="theme-color" content="#08396f">
    <title>Controle de Impressoras | Manutenção TI</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet">
    <link href="impressoras_style.css?v=1" rel="stylesheet">
</head>
<body>
<div class="top-strip"></div>
<div class="bg-grid"></div>
<div class="app">
<header class="main-header">
    <div class="header-content">
        <div class="brand-area">
            <div class="logo-box"><img src="assets/logo_pref.jpg" alt="Prefeitura de Extrema"></div>
            <div>
                <span class="eyebrow"><i class="bi bi-shield-lock-fill"></i>Acesso exclusivo • Marcelo e Renan</span>
                <h1 class="header-title">Controle de Impressoras</h1>
                <p class="header-subtitle">Cadastro, localização, recebimento na TI, manutenção, toner, retirada e histórico institucional.</p>
            </div>
        </div>
        <nav class="header-actions">
            <a href="nova_impressora.php" class="header-button primary"><i class="bi bi-plus-circle-fill"></i>Nova impressora</a>
            <a href="receber_impressora.php" class="header-button"><i class="bi bi-box-arrow-in-down"></i>Receber na TI</a>
            <a href="mapa_impressoras.php" class="header-button"><i class="bi bi-diagram-3-fill"></i>Mapa</a>
            <a href="<?= impE($urlExportacao) ?>" class="header-button"><i class="bi bi-filetype-csv"></i>Exportar</a>
            <a href="listar_os.php" class="header-button"><i class="bi bi-arrow-left-circle-fill"></i>Sistema</a>
            <a href="logout.php" class="header-button"><i class="bi bi-box-arrow-right"></i>Sair</a>
        </nav>
    </div>
</header>

<main class="main">
<?php if ($flash): ?>
    <div class="flash <?= $flash['tipo'] === 'sucesso' ? 'success' : 'error' ?>">
        <i class="bi <?= $flash['tipo'] === 'sucesso' ? 'bi-check-circle-fill' : 'bi-exclamation-triangle-fill' ?>"></i>
        <span><?= impE($flash['mensagem']) ?></span>
    </div>
<?php endif; ?>

<section class="hero">
    <div>
        <h2>Saiba onde está cada impressora e <span>acompanhe cada manutenção.</span></h2>
        <p>Localize por patrimônio, série, IP, setor ou modelo. Registre a entrada na TI, diagnóstico, peças, toner utilizado, testes, liberação e retirada.</p>
        <div class="hero-tags">
            <span class="hero-tag"><i class="bi bi-printer-fill"></i>Cadastro patrimonial</span>
            <span class="hero-tag"><i class="bi bi-tools"></i>Manutenção completa</span>
            <span class="hero-tag"><i class="bi bi-box-seam-fill"></i>Integração com toner</span>
            <span class="hero-tag"><i class="bi bi-clock-history"></i>Auditoria permanente</span>
        </div>
    </div>
    <aside class="hero-side">
        <small>Técnico conectado</small>
        <strong><?= impE(impressorasUsuarioAtual()) ?></strong>
        <span>Todas as alterações ficam vinculadas ao usuário autenticado.</span>
    </aside>
</section>

<section class="kpis">
    <article class="kpi"><div class="kpi-icon"><i class="bi bi-printer-fill"></i></div><strong><?= $kpis['total'] ?></strong><span>Total</span></article>
    <article class="kpi green"><div class="kpi-icon"><i class="bi bi-building-check"></i></div><strong><?= $kpis['em_uso'] ?></strong><span>Em uso</span></article>
    <article class="kpi purple"><div class="kpi-icon"><i class="bi bi-tools"></i></div><strong><?= $kpis['manutencao'] ?></strong><span>Na manutenção</span></article>
    <article class="kpi"><div class="kpi-icon"><i class="bi bi-box-arrow-up-right"></i></div><strong><?= $kpis['prontas'] ?></strong><span>Prontas</span></article>
    <article class="kpi gold"><div class="kpi-icon"><i class="bi bi-box-seam-fill"></i></div><strong><?= $kpis['estoque'] ?></strong><span>Estoque / reserva</span></article>
    <article class="kpi red"><div class="kpi-icon"><i class="bi bi-exclamation-octagon-fill"></i></div><strong><?= $kpis['problemas'] ?></strong><span>Divergências</span></article>
</section>

<section class="panel">
    <div class="panel-head">
        <div class="panel-title">
            <span class="panel-title-icon"><i class="bi bi-list-check"></i></span>
            <div><h3>Impressoras cadastradas</h3><p><?= $totalFiltrado ?> registro(s) encontrados.</p></div>
        </div>
        <a href="nova_impressora.php" class="primary-button"><i class="bi bi-plus-circle-fill"></i>Cadastrar</a>
    </div>

    <form method="get" class="filters">
        <input class="control" type="search" name="q" value="<?= impE($q) ?>" placeholder="Patrimônio, série, modelo, IP, pessoa ou setor...">
        <select class="control" name="status">
            <option value="">Todos os status</option>
            <?php foreach ([
                'EM_USO'=>'Em uso',
                'AGUARDANDO_DIAGNOSTICO'=>'Aguardando diagnóstico',
                'EM_MANUTENCAO'=>'Em manutenção',
                'AGUARDANDO_PECA'=>'Aguardando peça',
                'AGUARDANDO_TONER'=>'Aguardando toner',
                'PRONTA_RETIRADA'=>'Pronta retirada',
                'ESTOQUE_RESERVA'=>'Estoque / reserva',
                'ASSISTENCIA_EXTERNA'=>'Assistência externa',
                'NAO_LOCALIZADA'=>'Não localizada',
                'AGUARDANDO_BAIXA'=>'Aguardando baixa',
                'BAIXADA'=>'Baixada'
            ] as $codigo => $rotulo): ?>
                <option value="<?= impE($codigo) ?>" <?= $statusFiltro === $codigo ? 'selected' : '' ?>><?= impE($rotulo) ?></option>
            <?php endforeach; ?>
        </select>
        <select class="control" name="tipo">
            <option value="">Todos os tipos</option>
            <?php foreach (['MULTIFUNCIONAL','LASER','JATO_TINTA','TERMICA','MATRICIAL','ETIQUETAS','PLOTTER','SCANNER'] as $tipo): ?>
                <option value="<?= impE($tipo) ?>" <?= $tipoFiltro === $tipo ? 'selected' : '' ?>><?= impE(str_replace('_',' ',$tipo)) ?></option>
            <?php endforeach; ?>
        </select>
        <select class="control" name="setor_id">
            <option value="">Todos os setores</option>
            <?php foreach ($setores as $setor): ?>
                <option value="<?= (int) $setor['id'] ?>" <?= $setorFiltro === (int) $setor['id'] ? 'selected' : '' ?>>
                    <?= impE($setor['nome'] . ($setor['predio'] ? ' • ' . $setor['predio'] : '')) ?>
                </option>
            <?php endforeach; ?>
        </select>
        <button class="clear-button" type="submit"><i class="bi bi-search"></i>Filtrar</button>
    </form>

    <div class="table-wrap">
        <table class="data-table">
            <thead>
                <tr>
                    <th>Impressora</th>
                    <th>Identificação</th>
                    <th>Localização</th>
                    <th>Rede</th>
                    <th>Toner</th>
                    <th>Status</th>
                    <th>Atendimento</th>
                    <th style="text-align:right">Ações</th>
                </tr>
            </thead>
            <tbody>
            <?php foreach ($impressoras as $impressora): ?>
                <?php $st = impStatus((string) $impressora['status']); ?>
                <tr class="data-row">
                    <td data-label="Impressora">
                        <div class="item-main">
                            <span class="item-icon"><i class="bi bi-printer-fill"></i></span>
                            <span>
                                <strong><?= impE($impressora['marca'] . ' ' . $impressora['modelo']) ?></strong>
                                <small><?= impE(str_replace('_',' ',(string) $impressora['tipo'])) ?> • <?= (int) $impressora['colorida'] === 1 ? 'Colorida' : 'Monocromática' ?></small>
                            </span>
                        </div>
                    </td>
                    <td data-label="Identificação">
                        <span class="cell-main">Pat. <?= impE($impressora['patrimonio'] ?: 'não informado') ?></span>
                        <span class="cell-sub">Série: <?= impE($impressora['numero_serie'] ?: 'não informada') ?></span>
                        <span class="cell-sub"><?= impE($impressora['codigo_interno']) ?></span>
                    </td>
                    <td data-label="Localização">
                        <span class="cell-main"><?= impE($impressora['setor_nome'] ?: 'Sem setor') ?></span>
                        <span class="cell-sub"><?= impE(trim(($impressora['ambiente_nome'] ?: '') . ' • ' . ($impressora['localizacao_texto'] ?: ''), ' •') ?: 'Local não informado') ?></span>
                        <span class="cell-sub">Atual: <?= impE($impressora['local_atual'] ?: 'não informado') ?></span>
                    </td>
                    <td data-label="Rede">
                        <span class="cell-main"><?= impE($impressora['ip'] ?: 'Sem IP') ?></span>
                        <span class="cell-sub"><?= impE($impressora['nome_rede'] ?: 'Nome de rede não informado') ?></span>
                    </td>
                    <td data-label="Toner">
                        <span class="cell-main"><?= impE($impressora['toner_modelo'] ?: 'Não vinculado') ?></span>
                    </td>
                    <td data-label="Status">
                        <span class="status <?= impE($st['classe']) ?>"><i class="bi <?= impE($st['icone']) ?>"></i><?= impE($st['rotulo']) ?></span>
                    </td>
                    <td data-label="Atendimento">
                        <?php if (!empty($impressora['manutencao_id'])): ?>
                            <span class="cell-main"><?= impE($impressora['numero_atendimento']) ?></span>
                            <span class="cell-sub">Entrada: <?= impE(impData($impressora['manutencao_entrada'])) ?></span>
                        <?php else: ?>
                            <span class="cell-main">Sem atendimento ativo</span>
                        <?php endif; ?>
                    </td>
                    <td data-label="Ações">
                        <div class="actions">
                            <a class="action" href="detalhes_impressora.php?id=<?= (int) $impressora['id'] ?>"><i class="bi bi-eye-fill"></i>Ficha</a>
                            <a class="action" href="nova_impressora.php?id=<?= (int) $impressora['id'] ?>"><i class="bi bi-pencil-fill"></i>Editar</a>
                            <?php if (empty($impressora['manutencao_id'])): ?>
                                <a class="action green" href="receber_impressora.php?id=<?= (int) $impressora['id'] ?>"><i class="bi bi-box-arrow-in-down"></i>Receber TI</a>
                            <?php else: ?>
                                <a class="action purple" href="manutencao_impressora.php?id=<?= (int) $impressora['manutencao_id'] ?>"><i class="bi bi-tools"></i>Manutenção</a>
                            <?php endif; ?>
                            <?php if ($impressora['status'] === 'PRONTA_RETIRADA' && !empty($impressora['manutencao_id'])): ?>
                                <a class="action gold" href="retirada_impressora.php?id=<?= (int) $impressora['manutencao_id'] ?>"><i class="bi bi-box-arrow-up-right"></i>Retirada</a>
                            <?php endif; ?>
                            <a class="action cyan" href="mapa_impressoras.php?setor_id=<?= (int) ($impressora['setor_id'] ?? 0) ?>"><i class="bi bi-diagram-3-fill"></i>Mapa</a>
                        </div>
                    </td>
                </tr>
            <?php endforeach; ?>
            <?php if (empty($impressoras)): ?>
                <tr>
                    <td colspan="8">
                        <div class="empty">
                            <i class="bi bi-printer"></i>
                            <strong>Nenhuma impressora encontrada</strong>
                            <span>Cadastre a primeira impressora ou altere os filtros.</span>
                        </div>
                    </td>
                </tr>
            <?php endif; ?>
            </tbody>
        </table>
    </div>

    <?php if ($totalPaginas > 1): ?>
        <div class="pagination">
            <?php for ($p = max(1,$pagina-3); $p <= min($totalPaginas,$pagina+3); $p++): ?>
                <a class="page-link <?= $p === $pagina ? 'active' : '' ?>" href="<?= impE(impQueryPagina($p)) ?>"><?= $p ?></a>
            <?php endfor; ?>
        </div>
    <?php endif; ?>
</section>

<footer class="page-footer">
    <span>Prefeitura de Extrema • Gerência de Tecnologia<br>Controle institucional de impressoras.</span>
    <span><i class="bi bi-shield-lock-fill"></i> Acesso: Marcelo e Renan</span>
</footer>
</main>
</div>
<script src="alerta_global_cliente.js?v=7"></script>
</body>
</html>
