<?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');

$id = (int) ($_GET['id'] ?? $_POST['id'] ?? 0);
$csrf = impCsrf();
$erro = '';
$impressora = $id > 0 ? impBuscarImpressora($mysqli, $id) : null;

if ($id > 0 && !$impressora) {
    http_response_code(404);
    exit('Impressora não encontrada.');
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        impValidarCsrf();

        $patrimonio = impNulo($_POST['patrimonio'] ?? '', 50);
        $serie = impNulo($_POST['numero_serie'] ?? '', 100);
        $marca = impTexto($_POST['marca'] ?? '', 100);
        $modelo = impTexto($_POST['modelo'] ?? '', 150);

        if ($marca === '' || $modelo === '') {
            throw new RuntimeException('Informe a marca e o modelo.');
        }

        if ($patrimonio === null && $serie === null) {
            throw new RuntimeException(
                'Informe ao menos o patrimônio ou o número de série.'
            );
        }

        $tipo = impTexto($_POST['tipo'] ?? 'MULTIFUNCIONAL', 40);
        $tecnologia = impNulo($_POST['tecnologia'] ?? '', 40);
        $colorida = !empty($_POST['colorida']) ? 1 : 0;
        $propriedade = impTexto($_POST['propriedade'] ?? 'PROPRIA', 30);
        $contrato = impNulo($_POST['contrato'] ?? '', 120);
        $ip = impNulo($_POST['ip'] ?? '', 45);
        $mac = impNulo($_POST['mac'] ?? '', 30);
        $nomeRede = impNulo($_POST['nome_rede'] ?? '', 120);
        $conexao = impNulo($_POST['conexao'] ?? '', 50);
        $servidor = impNulo($_POST['servidor_impressao'] ?? '', 120);
        $fila = impNulo($_POST['fila_impressao'] ?? '', 150);
        $toner = impNulo($_POST['toner_modelo'] ?? '', 100);
        $tonerColorido = impNulo($_POST['toner_colorido'] ?? '', 1000);
        $cilindro = impNulo($_POST['cilindro_modelo'] ?? '', 120);
        $fusora = impNulo($_POST['fusora_modelo'] ?? '', 120);
        $contador = max(0, (int) ($_POST['contador_paginas'] ?? 0));
        $garantia = impNulo($_POST['garantia_ate'] ?? '', 10);
        $condicao = impTexto($_POST['condicao'] ?? 'NAO_AVALIADO', 30);
        $status = impTexto($_POST['status'] ?? 'CADASTRO_INICIAL', 40);
        $responsavel = impNulo($_POST['responsavel_nome'] ?? '', 150);
        $matricula = impNulo($_POST['responsavel_matricula'] ?? '', 50);
        $cargo = impNulo($_POST['responsavel_cargo'] ?? '', 120);
        $setorIdInformado = (int) ($_POST['setor_id'] ?? 0);
        $novoSetor = impNulo($_POST['novo_setor'] ?? '', 150);
        $secretaria = impNulo($_POST['secretaria'] ?? '', 150);
        $predio = impNulo($_POST['predio'] ?? '', 150);
        $andar = impNulo($_POST['andar'] ?? '', 80);
        $ambienteIdInformado = (int) ($_POST['ambiente_id'] ?? 0);
        $novoAmbiente = impNulo($_POST['novo_ambiente'] ?? '', 150);
        $localizacao = impNulo($_POST['localizacao_texto'] ?? '', 180);
        $localAtual = impNulo($_POST['local_atual'] ?? '', 150);
        $observacoes = impNulo($_POST['observacoes'] ?? '', 5000);
        $usuario = impressorasUsuarioAtual();

        $mysqli->begin_transaction();

        $setorId = impResolverSetor(
            $mysqli,
            $setorIdInformado,
            $novoSetor,
            $secretaria,
            $predio,
            $andar
        );

        $ambienteId = impResolverAmbiente(
            $mysqli,
            $setorId,
            $ambienteIdInformado,
            $novoAmbiente
        );

        $setorNomeNovo = null;

        if ($setorId) {
            $stmtSetor = impExecutar(
                $mysqli,
                'SELECT nome FROM ti_setores WHERE id = ?',
                [$setorId]
            );

            $setorNomeNovo = $stmtSetor
                ->get_result()
                ->fetch_assoc()['nome'] ?? null;

            $stmtSetor->close();
        }

        $setorBind = $setorId ?? 0;
        $ambienteBind = $ambienteId ?? 0;

        if ($id > 0) {
            $anterior = impBuscarImpressora($mysqli, $id, true);

            impExecutar(
                $mysqli,
                "UPDATE ti_impressoras
                 SET tipo=?, patrimonio=?, numero_serie=?, marca=?, modelo=?,
                     tecnologia=?, colorida=?, propriedade=?, contrato=?,
                     ip=?, mac=?, nome_rede=?, conexao=?, servidor_impressao=?,
                     fila_impressao=?, toner_modelo=?, toner_colorido=?,
                     cilindro_modelo=?, fusora_modelo=?, contador_paginas=NULLIF(?,0),
                     garantia_ate=?, condicao=?, status=?, responsavel_nome=?,
                     responsavel_matricula=?, responsavel_cargo=?,
                     setor_id=NULLIF(?,0), ambiente_id=NULLIF(?,0),
                     localizacao_texto=?, local_atual=?, observacoes=?,
                     atualizado_por=?
                 WHERE id=?",
                [
                    $tipo,$patrimonio,$serie,$marca,$modelo,$tecnologia,
                    $colorida,$propriedade,$contrato,$ip,$mac,$nomeRede,
                    $conexao,$servidor,$fila,$toner,$tonerColorido,
                    $cilindro,$fusora,$contador,$garantia,$condicao,$status,
                    $responsavel,$matricula,$cargo,$setorBind,$ambienteBind,
                    $localizacao,$localAtual,$observacoes,$usuario,$id
                ]
            )->close();

            impRegistrarHistorico(
                $mysqli,
                $id,
                null,
                'CADASTRO_ATUALIZADO',
                $anterior['status'],
                $status,
                $anterior['setor_nome'],
                $setorNomeNovo,
                $anterior['localizacao_texto'],
                $localizacao,
                'Dados cadastrais atualizados.'
            );

            $mensagem = 'Impressora atualizada com sucesso.';
        } else {
            $codigo = impCodigo('IMP');

            $stmt = impExecutar(
                $mysqli,
                "INSERT INTO ti_impressoras (
                    codigo_interno,tipo,patrimonio,numero_serie,marca,modelo,
                    tecnologia,colorida,propriedade,contrato,ip,mac,nome_rede,
                    conexao,servidor_impressao,fila_impressao,toner_modelo,
                    toner_colorido,cilindro_modelo,fusora_modelo,contador_paginas,
                    garantia_ate,condicao,status,responsavel_nome,
                    responsavel_matricula,responsavel_cargo,setor_id,ambiente_id,
                    localizacao_texto,local_atual,observacoes,criado_por,atualizado_por
                 )
                 VALUES (
                    ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
                    NULLIF(?,0),NULLIF(?,0),?,?,?,?,?
                 )",
                [
                    $codigo,$tipo,$patrimonio,$serie,$marca,$modelo,$tecnologia,
                    $colorida,$propriedade,$contrato,$ip,$mac,$nomeRede,
                    $conexao,$servidor,$fila,$toner,$tonerColorido,$cilindro,
                    $fusora,$contador,$garantia,$condicao,$status,$responsavel,
                    $matricula,$cargo,$setorBind,$ambienteBind,$localizacao,
                    $localAtual,$observacoes,$usuario,$usuario
                ]
            );

            $id = (int) $stmt->insert_id;
            $stmt->close();

            impRegistrarHistorico(
                $mysqli,
                $id,
                null,
                'CADASTRADA',
                null,
                $status,
                null,
                $setorNomeNovo,
                null,
                $localizacao,
                'Impressora incluída no inventário.'
            );

            $mensagem = 'Impressora cadastrada com sucesso.';
        }

        $mysqli->commit();
        impFlash('sucesso', $mensagem);
        impRedirecionar('detalhes_impressora.php?id=' . $id);
    } catch (Throwable $e) {
        try {
            $mysqli->rollback();
        } catch (Throwable) {
        }

        $erro = $e->getMessage();
    }
}

$setores = [];
$ambientes = [];
$toners = [];

$resultado = $mysqli->query(
    'SELECT id,nome,secretaria,predio,andar
     FROM ti_setores
     WHERE ativo=1
     ORDER BY nome'
);

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

$resultado = $mysqli->query(
    'SELECT id,setor_id,nome
     FROM ti_ambientes
     WHERE ativo=1
     ORDER BY nome'
);

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

if (impTabelaExiste($mysqli, 'tonner_estoque')) {
    $resultado = $mysqli->query(
        'SELECT modelo,quantidade
         FROM tonner_estoque
         ORDER BY modelo'
    );

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

$v = static fn(string $campo, mixed $padrao = ''): mixed =>
    $_POST[$campo] ?? ($impressora[$campo] ?? $padrao);
?>
<!doctype html>
<html lang="pt-BR">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
    <title><?= $id > 0 ? 'Editar' : 'Cadastrar' ?> Impressora</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=""></div>
            <div>
                <span class="eyebrow"><i class="bi bi-printer-fill"></i>Controle de Impressoras</span>
                <h1 class="header-title"><?= $id > 0 ? 'Editar impressora' : 'Cadastrar impressora' ?></h1>
                <p class="header-subtitle">Identificação, rede, suprimentos, localização e responsável.</p>
            </div>
        </div>
        <nav class="header-actions">
            <a href="impressoras.php" class="header-button primary"><i class="bi bi-arrow-left"></i>Voltar</a>
            <a href="mapa_impressoras.php" class="header-button"><i class="bi bi-diagram-3-fill"></i>Mapa</a>
        </nav>
    </div>
</header>

<main class="main">
<?php if ($erro): ?>
    <div class="flash error"><i class="bi bi-exclamation-triangle-fill"></i><?= impE($erro) ?></div>
<?php endif; ?>

<form method="post" class="form-card">
<input type="hidden" name="id" value="<?= $id ?>">
<input type="hidden" name="csrf_token" value="<?= impE($csrf) ?>">

<section class="form-section">
    <h3><i class="bi bi-upc-scan"></i>Identificação</h3>
    <div class="form-grid">
        <div class="form-group"><label>Patrimônio</label><input class="control" name="patrimonio" maxlength="50" value="<?= impE($v('patrimonio')) ?>"></div>
        <div class="form-group"><label>Número de série</label><input class="control" name="numero_serie" maxlength="100" value="<?= impE($v('numero_serie')) ?>"></div>
        <div class="form-group"><label>Tipo</label><select class="control" name="tipo"><?php foreach(['MULTIFUNCIONAL','LASER','JATO_TINTA','TERMICA','MATRICIAL','ETIQUETAS','PLOTTER','SCANNER'] as $op): ?><option value="<?= $op ?>" <?= $v('tipo','MULTIFUNCIONAL')===$op?'selected':'' ?>><?= impE(str_replace('_',' ',$op)) ?></option><?php endforeach; ?></select></div>
        <div class="form-group"><label>Marca *</label><input class="control" name="marca" required maxlength="100" value="<?= impE($v('marca')) ?>"></div>
        <div class="form-group"><label>Modelo *</label><input class="control" name="modelo" required maxlength="150" value="<?= impE($v('modelo')) ?>"></div>
        <div class="form-group"><label>Tecnologia</label><select class="control" name="tecnologia"><option value="">Não informada</option><?php foreach(['LASER','JATO_DE_TINTA','TERMICA','MATRICIAL'] as $op): ?><option value="<?= $op ?>" <?= $v('tecnologia')===$op?'selected':'' ?>><?= impE(str_replace('_',' ',$op)) ?></option><?php endforeach; ?></select></div>
        <div class="form-group"><label>Propriedade</label><select class="control" name="propriedade"><?php foreach(['PROPRIA'=>'Própria','LOCADA'=>'Locada','CEDIDA'=>'Cedida'] as $op=>$rot): ?><option value="<?= $op ?>" <?= $v('propriedade','PROPRIA')===$op?'selected':'' ?>><?= $rot ?></option><?php endforeach; ?></select></div>
        <div class="form-group"><label>Contrato / empresa</label><input class="control" name="contrato" maxlength="120" value="<?= impE($v('contrato')) ?>"></div>
        <div class="form-group"><label style="padding-top:23px;display:flex;gap:8px;align-items:center"><input type="checkbox" name="colorida" value="1" <?= (int)$v('colorida',0)===1?'checked':'' ?>> Impressão colorida</label></div>
    </div>
</section>

<section class="form-section">
    <h3><i class="bi bi-router-fill"></i>Rede e conexão</h3>
    <div class="form-grid">
        <div class="form-group"><label>IP</label><input class="control" name="ip" maxlength="45" value="<?= impE($v('ip')) ?>"></div>
        <div class="form-group"><label>MAC</label><input class="control" name="mac" maxlength="30" value="<?= impE($v('mac')) ?>"></div>
        <div class="form-group"><label>Nome na rede</label><input class="control" name="nome_rede" maxlength="120" value="<?= impE($v('nome_rede')) ?>"></div>
        <div class="form-group"><label>Conexão</label><input class="control" name="conexao" maxlength="50" placeholder="Rede, USB, Wi-Fi..." value="<?= impE($v('conexao')) ?>"></div>
        <div class="form-group"><label>Servidor de impressão</label><input class="control" name="servidor_impressao" maxlength="120" value="<?= impE($v('servidor_impressao')) ?>"></div>
        <div class="form-group"><label>Fila de impressão</label><input class="control" name="fila_impressao" maxlength="150" value="<?= impE($v('fila_impressao')) ?>"></div>
    </div>
</section>

<section class="form-section">
    <h3><i class="bi bi-printer-fill"></i>Suprimentos</h3>
    <div class="form-grid">
        <div class="form-group"><label>Toner principal</label><input class="control" name="toner_modelo" list="listaToners" maxlength="100" value="<?= impE($v('toner_modelo')) ?>"><datalist id="listaToners"><?php foreach($toners as $t): ?><option value="<?= impE($t['modelo']) ?>"><?= (int)$t['quantidade'] ?> em estoque</option><?php endforeach; ?></datalist></div>
        <div class="form-group two"><label>Toners coloridos</label><input class="control" name="toner_colorido" maxlength="1000" placeholder="Ciano, magenta, amarelo..." value="<?= impE($v('toner_colorido')) ?>"></div>
        <div class="form-group"><label>Cilindro</label><input class="control" name="cilindro_modelo" maxlength="120" value="<?= impE($v('cilindro_modelo')) ?>"></div>
        <div class="form-group"><label>Unidade fusora</label><input class="control" name="fusora_modelo" maxlength="120" value="<?= impE($v('fusora_modelo')) ?>"></div>
        <div class="form-group"><label>Contador de páginas</label><input class="control" type="number" min="0" name="contador_paginas" value="<?= (int)$v('contador_paginas',0) ?>"></div>
        <div class="form-group"><label>Garantia até</label><input class="control" type="date" name="garantia_ate" value="<?= impE($v('garantia_ate')) ?>"></div>
    </div>
</section>

<section class="form-section">
    <h3><i class="bi bi-geo-alt-fill"></i>Responsável e localização</h3>
    <div class="form-grid">
        <div class="form-group"><label>Responsável</label><input class="control" name="responsavel_nome" maxlength="150" value="<?= impE($v('responsavel_nome')) ?>"></div>
        <div class="form-group"><label>Matrícula</label><input class="control" name="responsavel_matricula" maxlength="50" value="<?= impE($v('responsavel_matricula')) ?>"></div>
        <div class="form-group"><label>Cargo / função</label><input class="control" name="responsavel_cargo" maxlength="120" value="<?= impE($v('responsavel_cargo')) ?>"></div>
        <div class="form-group"><label>Setor existente</label><select class="control" name="setor_id" id="setorId"><option value="">Selecione</option><?php foreach($setores as $s): ?><option value="<?= (int)$s['id'] ?>" <?= (int)$v('setor_id',0)===(int)$s['id']?'selected':'' ?>><?= impE($s['nome'] . ($s['predio']?' • '.$s['predio']:'')) ?></option><?php endforeach; ?></select></div>
        <div class="form-group"><label>Novo setor</label><input class="control" name="novo_setor" maxlength="150" placeholder="Use somente se não estiver na lista"></div>
        <div class="form-group"><label>Secretaria</label><input class="control" name="secretaria" maxlength="150"></div>
        <div class="form-group"><label>Prédio</label><input class="control" name="predio" maxlength="150"></div>
        <div class="form-group"><label>Andar / bloco</label><input class="control" name="andar" maxlength="80"></div>
        <div class="form-group"><label>Ambiente existente</label><select class="control" name="ambiente_id" id="ambienteId"><option value="">Selecione</option><?php foreach($ambientes as $a): ?><option data-setor="<?= (int)$a['setor_id'] ?>" value="<?= (int)$a['id'] ?>" <?= (int)$v('ambiente_id',0)===(int)$a['id']?'selected':'' ?>><?= impE($a['nome']) ?></option><?php endforeach; ?></select></div>
        <div class="form-group"><label>Novo ambiente / sala</label><input class="control" name="novo_ambiente" maxlength="150"></div>
        <div class="form-group"><label>Posição exata</label><input class="control" name="localizacao_texto" maxlength="180" placeholder="Recepção, balcão, mesa..." value="<?= impE($v('localizacao_texto')) ?>"></div>
        <div class="form-group"><label>Local atual</label><input class="control" name="local_atual" maxlength="150" placeholder="Setor, Manutenção TI, estoque..." value="<?= impE($v('local_atual')) ?>"></div>
    </div>
</section>

<section class="form-section">
    <h3><i class="bi bi-clipboard-check-fill"></i>Situação</h3>
    <div class="form-grid">
        <div class="form-group"><label>Condição</label><select class="control" name="condicao"><?php foreach(['NAO_AVALIADO'=>'Não avaliado','NOVO'=>'Novo','BOM'=>'Bom','REGULAR'=>'Regular','DANIFICADO'=>'Danificado'] as $op=>$rot): ?><option value="<?= $op ?>" <?= $v('condicao','NAO_AVALIADO')===$op?'selected':'' ?>><?= $rot ?></option><?php endforeach; ?></select></div>
        <div class="form-group"><label>Status</label><select class="control" name="status"><?php foreach(['CADASTRO_INICIAL'=>'Cadastro inicial','EM_USO'=>'Em uso no setor','ESTOQUE_RESERVA'=>'Estoque / reserva','NAO_LOCALIZADA'=>'Não localizada','AGUARDANDO_BAIXA'=>'Aguardando baixa','BAIXADA'=>'Baixada'] as $op=>$rot): ?><option value="<?= $op ?>" <?= $v('status','CADASTRO_INICIAL')===$op?'selected':'' ?>><?= $rot ?></option><?php endforeach; ?></select></div>
        <div class="form-group full"><label>Observações</label><textarea class="control" name="observacoes"><?= impE($v('observacoes')) ?></textarea></div>
    </div>
</section>

<div class="form-actions">
    <a class="button" href="impressoras.php">Cancelar</a>
    <button class="button primary" type="submit"><i class="bi bi-check-circle-fill"></i>Salvar impressora</button>
</div>
</form>
</main>
</div>
<script>
const setor = document.getElementById('setorId');
const ambiente = document.getElementById('ambienteId');
function filtrarAmbientes() {
    const id = setor.value;
    [...ambiente.options].forEach((opcao, indice) => {
        if (indice === 0) return;
        opcao.hidden = id !== '' && opcao.dataset.setor !== id;
    });
    if (ambiente.selectedOptions[0]?.hidden) ambiente.value = '';
}
setor.addEventListener('change', filtrarAmbientes);
filtrarAmbientes();
</script>
</body>
</html>
