<?php
// processa_editar_empresa.php (ou o nome correto do seu script de processamento)

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

require_once 'conexao.php'; // Fornece $pdo globalmente
require_once 'env.php';     // Carrega $_ENV

// Configurações de erro (idealmente controladas por $_ENV['APP_DEBUG'])
// error_reporting(E_ALL);
// ini_set('display_errors', 1);

// Verifica se o usuário é administrador
if (($_SESSION['role'] ?? '') !== 'Administradores' && ($_SESSION['role'] ?? '') !== 'Administrador') {
    $_SESSION['mensagem_login'] = "Acesso negado! Você não tem permissão para esta ação.";
    header("Location: login.php");
    exit();
}

// Verifica se o formulário foi enviado via POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $_SESSION['mensagem_listar_empresas'] = 'Método de acesso inválido.'; // Mensagem para a página de listagem
    $_SESSION['tipo_mensagem_listar_empresas'] = 'warning';
    header("Location: listar_empresas.php");
    exit;
}

// --- Verificação CSRF ---
// Assumindo que o formulário editar_empresa.php envia 'csrf_token'
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";
    // Precisa do ID da empresa para redirecionar corretamente
    $id_empresa_redirect_csrf = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
    $redirect_location_csrf = $id_empresa_redirect_csrf ? "editar_empresa.php?id={$id_empresa_redirect_csrf}" : "listar_empresas.php";
    header("Location: " . $redirect_location_csrf);
    exit();
}
// Considere invalidar o token se for de uso único.


// Configurações de Upload (do .env com fallbacks)
$upload_dir_logos = rtrim(($_ENV['UPLOAD_DIR_LOGOS'] ?? 'uploads/logo'), '/') . '/';
$max_logo_size_mb = (int)($_ENV['MAX_LOGO_SIZE_MB'] ?? 2);
$max_upload_size_bytes_logo = $max_logo_size_mb * 1024 * 1024;


// Capturar e validar o ID da empresa sendo editada
$id_empresa_editar = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
if (!$id_empresa_editar) {
    $_SESSION['mensagem_listar_empresas'] = 'ID da empresa inválido para edição.';
    $_SESSION['tipo_mensagem_listar_empresas'] = 'danger';
    header("Location: listar_empresas.php");
    exit;
}

// Coleta 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_input         = preg_replace('/\D/', '', trim($_POST['cnpj'] ?? ''));
$senha_nova_input   = $_POST['senha'] ?? '';
$logotipo_atual_hidden = trim($_POST['logotipo_atual'] ?? ''); // Do campo hidden no formulário

// Campos que só o admin pode mudar (se enviados)
$tipo_anuncio_form  = isset($_POST['tipo_anuncio']) ? trim($_POST['tipo_anuncio']) : null;
$role_form          = isset($_POST['role']) ? trim($_POST['role']) : null;


// --- Validações ---
$erros_form = [];
if (empty($nome_empresa)) $erros_form['nome_empresa'] = "Nome da empresa é obrigatório.";
if (empty($contato)) $erros_form['contato'] = "Nome do contato é obrigatório.";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $erros_form['email'] = "Formato de e-mail inválido.";
} else {
    // Verificar se o e-mail (login) já existe para OUTRA empresa/usuário
    if ($pdo) {
        try {
            // Nota: Se o login pode ser compartilhado entre tipos de usuário (admin, empresa, candidato),
            // a verificação de unicidade deve checar todas as tabelas relevantes.
            // Aqui, estamos verificando apenas na tabela Empresas para o login da empresa.
            $stmt_check_email = $pdo->prepare("SELECT id FROM Empresas WHERE (email = :email OR login = :login) AND id != :id_empresa");
            $stmt_check_email->execute([':email' => $email, ':login' => $email, ':id_empresa' => $id_empresa_editar]);
            if ($stmt_check_email->fetch()) {
                $erros_form['email'] = "Este e-mail/login já está cadastrado para outra empresa.";
            }
        } catch (PDOException $e) {
            error_log("Erro ao verificar e-mail duplicado para empresa ID {$id_empresa_editar}: " . $e->getMessage());
            $erros_form['geral'] = "Erro ao verificar dados. Tente novamente.";
        }
    }
}
if (empty($telefone_comercial) || !preg_match('/^(\d{10}|\d{11})$/', $telefone_comercial)) $erros_form['telefone_comercial'] = "Telefone comercial inválido.";
if (empty($celular) || !preg_match('/^(\d{10}|\d{11})$/', $celular)) $erros_form['celular'] = "Celular inválido.";
if (empty($cidade)) $erros_form['cidade'] = "Cidade é obrigatória.";
if (empty($estado) || strlen($estado) !== 2) $erros_form['estado'] = "Estado (UF) inválido.";

// Função para validar CNPJ (deve ser a mesma usada em cadastro_empresa.php)
if (!function_exists('validar_cnpj_processa_edicao')) {
    function validar_cnpj_processa_edicao($cnpj_val_edit) { // Nome diferente para evitar conflito se já incluída
        $cnpj_val_edit = preg_replace('/[^0-9]/', '', (string)$cnpj_val_edit);
        if (strlen($cnpj_val_edit) != 14 || preg_match('/(\d)\1{13}/', $cnpj_val_edit)) 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_val_edit[$i] * $m; }
            if ($cnpj_val_edit[$i] != (($d % 11) < 2 ? 0 : 11 - ($d % 11))) return false;
        }
        return true;
    }
}
if (empty($cnpj_input) || !validar_cnpj_processa_edicao($cnpj_input)) $erros_form['cnpj'] = "CNPJ inválido ou não preenchido.";

$nova_senha_hashed = null;
if (!empty($senha_nova_input)) {
    if (strlen($senha_nova_input) < 6) { // Ou sua política de senha
        $erros_form['senha'] = "A nova senha deve ter pelo menos 6 caracteres.";
    } else {
        $nova_senha_hashed = password_hash($senha_nova_input, PASSWORD_BCRYPT);
    }
}

// Validações de admin
if (($_SESSION['role'] ?? '') === 'Administradores' || ($_SESSION['role'] ?? '') === 'Administrador') {
    if ($tipo_anuncio_form !== null && !in_array($tipo_anuncio_form, ['pago', 'gratuito'])) {
        $erros_form['tipo_anuncio'] = "Tipo de anúncio inválido selecionado.";
    }
    if ($role_form !== null && !in_array($role_form, ['Empresas', 'Administradores', 'Candidatos'])) { // Verifique roles válidos para a tabela Empresas
        $erros_form['role'] = "Papel (Role) inválido selecionado.";
    }
}


// --- Processar Upload do Logotipo (se um novo foi enviado) ---
$logotipo_path_para_db = $logotipo_atual_hidden; // Mantém o atual por 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)) {
        $erros_form['logotipo'] = "Falha ao acessar diretório de upload.";
        error_log("Falha ao criar/acessar diretório de upload para logos: " . $upload_dir_logos);
    } else {
        $nome_original_logo = basename($_FILES['logotipo']['name']);
        $extensao_logo = strtolower(pathinfo($nome_original_logo, PATHINFO_EXTENSION));
        $nome_unico_logo = "logo_" . $id_empresa_editar . "_" . time() . "." . $extensao_logo;
        $caminho_upload_logo = $upload_dir_logos . $nome_unico_logo;

        $allowed_mime_types_logo = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp'];
        $allowed_extensions_logo = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];

        if (in_array($_FILES['logotipo']['type'], $allowed_mime_types_logo) && in_array($extensao_logo, $allowed_extensions_logo)) {
            if ($_FILES['logotipo']['size'] <= $max_upload_size_bytes_logo) {
                if (move_uploaded_file($_FILES['logotipo']['tmp_name'], $caminho_upload_logo)) {
                    // Se upload ok, tenta excluir o antigo se diferente e existir
                    if (!empty($logotipo_atual_hidden) && $logotipo_atual_hidden !== ($upload_dir_logos . $nome_unico_logo)) {
                        $caminho_fisico_antigo = $_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($logotipo_atual_hidden, '/');
                         if (strpos($logotipo_atual_hidden, ($_ENV['SITE_URL'] ?? '---')) === 0) {
                            $caminho_fisico_antigo = str_replace($_ENV['SITE_URL'], $_SERVER['DOCUMENT_ROOT'], $logotipo_atual_hidden);
                        }
                        if (file_exists($caminho_fisico_antigo) && is_file($caminho_fisico_antigo)) { // Verifica se é arquivo
                            if (!unlink($caminho_fisico_antigo)) {
                                error_log("Falha ao excluir logotipo antigo: " . $caminho_fisico_antigo);
                            }
                        } elseif(!empty($logotipo_atual_hidden)){
                             error_log("Logotipo antigo não encontrado para exclusão: " . $caminho_fisico_antigo);
                        }
                    }
                    $logotipo_path_para_db = $upload_dir_logos . $nome_unico_logo; // Caminho relativo para o BD
                } else {
                    $erros_form['logotipo'] = "Erro ao mover o arquivo de logotipo.";
                }
            } else {
                $erros_form['logotipo'] = "Arquivo de logotipo muito grande (Máx: {$max_logo_size_mb}MB).";
            }
        } else {
            $erros_form['logotipo'] = "Tipo de arquivo de logotipo inválido.";
        }
    }
} elseif (isset($_FILES['logotipo']) && $_FILES['logotipo']['error'] !== UPLOAD_ERR_NO_FILE) {
    $erros_form['logotipo'] = "Erro no upload do logotipo. Código: " . $_FILES['logotipo']['error'];
}


// Se houver erros de validação, redireciona de volta
if (!empty($erros_form)) {
    $_SESSION['mensagem_edit_empresa'] = "Foram encontrados erros. Por favor, corrija-os.";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    $_SESSION['form_errors_edit_empresa'] = $erros_form; // Para exibir erros por campo
    $_SESSION['form_data_edit_empresa'] = $_POST;     // Para repopular o formulário
    header("Location: editar_empresa.php?id=" . $id_empresa_editar);
    exit;
}


// --- Atualizar dados no banco ---
if (!$pdo) {
    $_SESSION['mensagem_edit_empresa'] = "Erro crítico de sistema (DB). Não foi possível salvar as alterações.";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    header("Location: editar_empresa.php?id=" . $id_empresa_editar);
    exit();
}

try {
    $campos_para_update = [
        'nome_empresa' => $nome_empresa,
        'contato' => $contato,
        'setor_departamento' => $setor_departamento,
        'email' => $email,
        'login' => $email, // Atualizando o login para ser o mesmo que o e-mail
        'telefone_comercial' => $telefone_comercial,
        'celular' => $celular,
        'cidade' => $cidade,
        'estado' => $estado,
        'cnpj' => $cnpj_input, // CNPJ já limpo
        'logotipo' => $logotipo_path_para_db
    ];

    if ($nova_senha_hashed) {
        $campos_para_update['senha'] = $nova_senha_hashed;
    }

    // Campos que só o admin pode mudar
    if (($_SESSION['role'] ?? '') === 'Administradores' || ($_SESSION['role'] ?? '') === 'Administrador') {
        if ($tipo_anuncio_form !== null) {
            $campos_para_update['tipo_anuncio'] = $tipo_anuncio_form;
        }
        if ($role_form !== null) {
            $campos_para_update['role'] = $role_form; // Atualiza a role da empresa
        }
    }

    $sql_set_parts_update = [];
    $params_execute = [];
    foreach ($campos_para_update as $coluna => $valor) {
        $sql_set_parts_update[] = "`{$coluna}` = ?";
        $params_execute[] = $valor;
    }
    $params_execute[] = $id_empresa_editar; // Para o WHERE id = ?

    if (empty($sql_set_parts_update)) {
        $_SESSION['mensagem_edit_empresa'] = 'Nenhuma alteração para salvar.';
        $_SESSION['tipo_mensagem_edit_empresa'] = 'info';
        header("Location: editar_empresa.php?id=" . $id_empresa_editar);
        exit;
    }

    $sql_update_final = "UPDATE Empresas SET " . implode(", ", $sql_set_parts_update) . " WHERE id = ?";
    
    $stmt_update = $pdo->prepare($sql_update_final);
    $stmt_update->execute($params_execute);

    // Log da ação de edição bem-sucedida
    if (isset($_SESSION['id'], $_SESSION['role'])) {
        $usuario_id_log = $_SESSION['id']; // ID do admin que fez a ação
        $role_log = $_SESSION['role'];
        $role_map_hist_upd = ['Administradores' => 'admin', 'Administrador' => 'admin']; // Admin é sempre 'admin' no log
        $tipo_usuario_log = $role_map_hist_upd[$role_log] ?? 'admin';
        $pagina_acessada_log = "processa_editar_empresa.php (ID Empresa Editada: {$id_empresa_editar}, Sucesso por Admin ID: {$usuario_id_log})";
        
        try {
            $stmt_hist_upd = $pdo->prepare("INSERT INTO historico_acessos (usuario_id, tipo_usuario, pagina_acessada, data_acesso) VALUES (?, ?, ?, NOW())");
            $stmt_hist_upd->execute([$usuario_id_log, $tipo_usuario_log, $pagina_acessada_log]);
        } catch (PDOException $e_log_upd) {
            error_log("Erro ao registrar histórico de edição de empresa: " . $e_log_upd->getMessage());
        }
    }

    $_SESSION['mensagem_edit_empresa'] = "Empresa atualizada com sucesso!";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'success';
    
    // Admin volta para a lista, empresa volta para a edição (para ver as mudanças)
    if (($_SESSION['role'] ?? '') === 'Administradores' || ($_SESSION['role'] ?? '') === 'Administrador') {
        header("Location: listar_empresas.php?msg=sucesso_edicao&id_editado=" . $id_empresa_editar);
    } else { // Se uma empresa editou a si mesma (cenário menos provável com este nome de script)
        header("Location: editar_empresa.php?id=" . $id_empresa_editar . "&msg=sucesso");
    }
    exit();

} catch (PDOException $e) {
    error_log("Erro PDO ao atualizar empresa ID {$id_empresa_editar}: " . $e->getMessage() . " Query: " . ($sql_update_final ?? 'N/A'));
    $_SESSION['mensagem_edit_empresa'] = "Erro de banco de dados ao atualizar a empresa: " . $e->getMessage(); // Mostrar erro em dev
    // $_SESSION['mensagem_edit_empresa'] = "Erro interno ao atualizar a empresa. Tente novamente."; // Para produção
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    $_SESSION['form_data_edit_empresa'] = $_POST;
    header("Location: editar_empresa.php?id=" . $id_empresa_editar);
    exit();
}
?>