<?php
// editar_lista_empresa.php (processamento)

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}
require_once 'conexao.php'; // Fornece $pdo
require_once 'env.php';     // Carrega $_ENV

// Verificar se o usuário é administrador
if (($_SESSION['role'] ?? '') !== 'Administradores' && ($_SESSION['role'] ?? '') !== 'Administrador') {
    // Normalmente, este script não seria acessado diretamente sem ser admin.
    // Se for acessado, pode ser um erro ou tentativa de acesso indevido.
    $_SESSION['mensagem_listar_empresas'] = "Acesso negado!";
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
    header("Location: listar_empresas.php"); // Ou login.php
    exit();
}

// --- Verificação CSRF ---
if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    $_SESSION['mensagem_edit_empresa'] = "Erro de validação de segurança (CSRF). Ação cancelada.";
    $_SESSION['tipo_mensagem_edit_empresa'] = "danger";
    $_SESSION['form_data_edit_empresa'] = $_POST; // Para repopular
    // Precisa do ID da empresa para redirecionar corretamente
    $id_empresa_redirect = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
    $redirect_location = $id_empresa_redirect ? "editar_empresa.php?id={$id_empresa_redirect}" : "listar_empresas.php";
    header("Location: " . $redirect_location);
    exit();
}
// CSRF token é geralmente de uso único para o formulário que o gerou.
// Se este script é o único que o usa, pode ser unset aqui. Se não, o formulário de edição precisa regenerá-lo.
// Para formulários de edição, é comum manter o token da sessão principal e o formulário apenas o inclui.


$id_empresa = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);

if (!$id_empresa) {
    $_SESSION['mensagem_listar_empresas'] = "ID da empresa inválido para edição.";
    $_SESSION['tipo_mensagem_listar_empresas'] = "danger";
    header("Location: listar_empresas.php");
    exit();
}

// Função para validar CNPJ (mantenha ou mova para um arquivo de utilitários)
if (!function_exists('validar_cnpj_local')) { // Adicionado _local para evitar conflitos se já existir globalmente
    function validar_cnpj_local($cnpj) {
        $cnpj = preg_replace('/[^0-9]/', '', (string)$cnpj);
        if (strlen($cnpj) != 14 || preg_match('/(\d)\1{13}/', $cnpj)) return false;
        for ($t = 12; $t < 14; $t++) {
            for ($d = 0, $m = ($t == 12 ? 5 : 6), $i = 0; $i < $t; $m = ($m == 2 ? 9 : $m - 1)) {
                $d += $cnpj[$i] * $m;
            }
            if ($cnpj[$i] != (($d % 11) < 2 ? 0 : 11 - ($d % 11))) return false;
        }
        return true;
    }
}

// Captura e limpeza básica dos dados do formulário
$nome_empresa       = trim($_POST['nome_empresa'] ?? '');
$contato            = trim($_POST['contato'] ?? '');
$setor_departamento = trim($_POST['setor_departamento'] ?? '');
$email              = filter_var(trim($_POST['email'] ?? ''), FILTER_SANITIZE_EMAIL);
$telefone_comercial = preg_replace('/\D/', '', trim($_POST['telefone_comercial'] ?? ''));
$celular            = preg_replace('/\D/', '', trim($_POST['celular'] ?? ''));
$cidade             = trim($_POST['cidade'] ?? '');
$estado             = trim($_POST['estado'] ?? '');
$cnpj               = preg_replace('/\D/', '', trim($_POST['cnpj'] ?? ''));
$logotipo_atual     = trim($_POST['logotipo_atual'] ?? '');

// Campos específicos do admin (se presentes no formulário e enviados)
$tipo_anuncio_form  = isset($_POST['tipo_anuncio']) ? trim($_POST['tipo_anuncio']) : null; // Só se admin enviar
$role_form          = isset($_POST['role']) ? trim($_POST['role']) : null;                 // Só se admin enviar


// Validações
$erros = [];
if (empty($nome_empresa)) $erros['nome_empresa'] = "Nome da empresa é obrigatório.";
if (empty($contato)) $erros['contato'] = "Nome do contato é obrigatório.";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $erros['email'] = "E-mail inválido.";
if (empty($cnpj) || !validar_cnpj_local($cnpj)) $erros['cnpj'] = "CNPJ inválido ou não preenchido.";
if (empty($telefone_comercial) || !preg_match('/^(\d{10}|\d{11})$/', $telefone_comercial)) $erros['telefone_comercial'] = "Telefone comercial inválido (apenas números, com DDD).";
if (empty($celular) || !preg_match('/^(\d{10}|\d{11})$/', $celular)) $erros['celular'] = "Celular inválido (apenas números, com DDD).";
if (empty($cidade)) $erros['cidade'] = "Cidade é obrigatória.";
if (empty($estado) || strlen($estado) !== 2) $erros['estado'] = "Estado inválido.";

// Validação de senha (se fornecida)
$nova_senha_hash = null;
if (!empty($_POST['senha'])) {
    if (strlen($_POST['senha']) < 6) { // Ou sua regra de complexidade
        $erros['senha'] = "A nova senha deve ter pelo menos 6 caracteres.";
    } else {
        $nova_senha_hash = password_hash($_POST['senha'], PASSWORD_BCRYPT);
    }
}

// Validação do tipo de anúncio e role (se admin está editando)
if (($_SESSION['role'] ?? '') === 'Administradores' || ($_SESSION['role'] ?? '') === 'Administrador') {
    if ($tipo_anuncio_form !== null && !in_array($tipo_anuncio_form, ['pago', 'gratuito'])) {
        $erros['tipo_anuncio'] = "Tipo de anúncio inválido.";
    }
    if ($role_form !== null && !in_array($role_form, ['Empresas', 'Administradores', 'Candidatos'])) { // Verifique se 'Candidatos' é uma role válida para a tabela Empresas
        $erros['role'] = "Papel (Role) inválido.";
    }
}


if (!empty($erros)) {
    $_SESSION['mensagem_edit_empresa'] = "Foram encontrados erros no formulário.";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    $_SESSION['form_errors_edit_empresa'] = $erros;
    $_SESSION['form_data_edit_empresa'] = $_POST;
    header("Location: editar_empresa.php?id=" . $id_empresa);
    exit();
}

// Upload de novo logotipo (se enviado)
$logotipo_caminho_db = $logotipo_atual; // Mantém o atual por padrão
$upload_dir_logos = rtrim(($_ENV['UPLOAD_DIR_LOGOS'] ?? 'uploads/logo'), '/') . '/'; // Do .env ou padrão

if (isset($_FILES['logotipo']) && $_FILES['logotipo']['error'] === UPLOAD_ERR_OK) {
    if (!is_dir($upload_dir_logos) && !mkdir($upload_dir_logos, 0775, true) && !is_dir($upload_dir_logos)) {
        $_SESSION['mensagem_edit_empresa'] = "Falha ao criar diretório de upload.";
        $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
        header("Location: editar_empresa.php?id=" . $id_empresa);
        exit();
    }

    $logotipo_nome_original = basename($_FILES['logotipo']['name']);
    $extensao_logotipo = strtolower(pathinfo($logotipo_nome_original, PATHINFO_EXTENSION));
    $logotipo_novo_nome = "logotipo_" . uniqid() . "." . $extensao_logotipo;
    $logotipo_caminho_completo_servidor = $upload_dir_logos . $logotipo_novo_nome;

    $allowed_mime_types = ['image/png', 'image/jpeg', 'image/gif', 'image/bmp'];
    $allowed_extensions = ['png', 'jpg', 'jpeg', 'gif', 'bmp'];

    if (in_array($_FILES['logotipo']['type'], $allowed_mime_types) && in_array($extensao_logotipo, $allowed_extensions)) {
        if ($_FILES['logotipo']['size'] <= (($_ENV['MAX_LOGO_SIZE_MB'] ?? 2) * 1024 * 1024)) { // Max 2MB por padrão
            if (move_uploaded_file($_FILES['logotipo']['tmp_name'], $logotipo_caminho_completo_servidor)) {
                // Se o upload foi bem-sucedido, remove o logotipo antigo (se existir e for diferente)
                if (!empty($logotipo_atual) && $logotipo_atual !== $logotipo_caminho_completo_servidor && file_exists($logotipo_atual)) {
                     // Cuidado: $logotipo_atual pode ser um caminho relativo à raiz do site.
                     // file_exists precisa do caminho absoluto no servidor.
                     // Assumindo que $logotipo_atual é como 'uploads/logo/nome.ext'
                    $caminho_antigo_fisico = __DIR__ . '/' . $logotipo_atual; // Ajuste se $logotipo_atual for absoluto
                    if (strpos($logotipo_atual, $_ENV['SITE_URL'] ?? '---') === 0) { // Se for URL completa
                         $caminho_antigo_fisico = str_replace($_ENV['SITE_URL'], $_SERVER['DOCUMENT_ROOT'], $logotipo_atual);
                    } else if (strpos($logotipo_atual, '/') !== 0) { // Caminho relativo simples
                         $caminho_antigo_fisico = $_SERVER['DOCUMENT_ROOT'] . '/' . $logotipo_atual;
                    } // Se for caminho relativo a partir da raiz, ex: /uploads/logo/file.png

                    if (file_exists($caminho_antigo_fisico)) {
                        unlink($caminho_antigo_fisico);
                    } else {
                        error_log("Logotipo antigo não encontrado para exclusão: " . $caminho_antigo_fisico . " (Valor BD: " . $logotipo_atual . ")");
                    }
                }
                $logotipo_caminho_db = $upload_dir_logos . $logotipo_novo_nome; // Caminho relativo para salvar no BD
            } else {
                $_SESSION['mensagem_edit_empresa'] = "Erro ao mover o arquivo de logotipo.";
                $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
                header("Location: editar_empresa.php?id=" . $id_empresa);
                exit();
            }
        } else {
             $_SESSION['mensagem_edit_empresa'] = "Arquivo de logotipo muito grande (Máx: " . ($_ENV['MAX_LOGO_SIZE_MB'] ?? 2) . "MB).";
             $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
             header("Location: editar_empresa.php?id=" . $id_empresa);
             exit();
        }
    } else {
        $_SESSION['mensagem_edit_empresa'] = "Formato de arquivo de logotipo inválido. Apenas PNG, JPG, GIF, BMP são permitidas.";
        $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
        header("Location: editar_empresa.php?id=" . $id_empresa);
        exit();
    }
}

// $pdo já está disponível
if (!$pdo) {
    error_log("Falha ao processar edição de empresa: conexão PDO não disponível.");
    $_SESSION['mensagem_edit_empresa'] = "Erro crítico de sistema (DB).";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    header("Location: editar_empresa.php?id=" . $id_empresa);
    exit();
}

try {
    // Construção da query SQL dinamicamente
    $sql_update_parts = [
        "nome_empresa = ?", "contato = ?", "setor_departamento = ?", "email = ?", 
        "telefone_comercial = ?", "celular = ?", "cidade = ?", "estado = ?", 
        "cnpj = ?", "logotipo = ?"
    ];
    $params = [
        $nome_empresa, $contato, $setor_departamento, $email, $telefone_comercial, 
        $celular, $cidade, $estado, $cnpj, $logotipo_caminho_db
    ];
    $types = "ssssssssss"; // 10 strings

    if ($nova_senha_hash) {
        $sql_update_parts[] = "senha = ?";
        $params[] = $nova_senha_hash;
        $types .= "s";
    }

    // Adicionar campos de admin se estiverem sendo alterados por um admin
    if (($_SESSION['role'] ?? '') === 'Administradores' || ($_SESSION['role'] ?? '') === 'Administrador') {
        if ($tipo_anuncio_form !== null) {
            $sql_update_parts[] = "tipo_anuncio = ?";
            $params[] = $tipo_anuncio_form;
            $types .= "s";
        }
        if ($role_form !== null) {
            $sql_update_parts[] = "role = ?";
            $params[] = $role_form;
            $types .= "s";
        }
    }

    $params[] = $id_empresa; // Para o WHERE id = ?
    $types .= "i";

    $sql = "UPDATE Empresas SET " . implode(", ", $sql_update_parts) . " WHERE id = ?";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);

    // Log da ação de edição bem-sucedida
    if (isset($_SESSION['id'], $_SESSION['role'])) {
        $usuario_id_log = $_SESSION['id'];
        $role_log = $_SESSION['role'];
        $role_map_hist = ['Empresas' => 'empresa', 'Candidatos' => 'candidato', 'Administradores' => 'admin', 'Administrador' => 'admin'];
        $tipo_usuario_log = $role_map_hist[$role_log] ?? 'desconhecido';
        $pagina_acessada_log = "processa_editar_empresa.php (ID Empresa Editada: {$id_empresa}, Sucesso)";
        
        try {
            $stmt_hist = $pdo->prepare("INSERT INTO historico_acessos (usuario_id, tipo_usuario, pagina_acessada, data_acesso) VALUES (?, ?, ?, NOW())");
            $stmt_hist->execute([$usuario_id_log, $tipo_usuario_log, $pagina_acessada_log]);
        } catch (PDOException $e_log) {
            error_log("Erro ao registrar histórico de acesso para edição de empresa: " . $e_log->getMessage());
        }
    }

    $_SESSION['mensagem_edit_empresa'] = "Empresa atualizada com sucesso!";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'success';
    
    // Se um admin editou, redireciona para a lista de empresas, senão para a página de edição da empresa (para ver as mudanças)
    if (($_SESSION['role'] ?? '') === 'Administradores' || ($_SESSION['role'] ?? '') === 'Administrador') {
        header("Location: listar_empresas.php?msg=sucesso_edicao&id_editado=" . $id_empresa);
    } else {
        header("Location: editar_empresa.php?id=" . $id_empresa . "&msg=sucesso"); // Adiciona msg para a própria página
    }
    exit();

} catch (PDOException $e) {
    error_log("Erro PDO ao atualizar empresa ID {$id_empresa}: " . $e->getMessage());
    $_SESSION['mensagem_edit_empresa'] = "Erro ao atualizar a empresa: " . $e->getMessage();
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    $_SESSION['form_data_edit_empresa'] = $_POST; // Mantém os dados para repopular
    header("Location: editar_empresa.php?id=" . $id_empresa);
    exit();
}

// O bloco de rastreamento de acesso original aqui abaixo não seria executado
// devido aos múltiplos `exit()` no fluxo principal do script.
?>