<?php
// processa_editar_empresa.php

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

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

// --- Verificações de Segurança e Autorização ---
if (!isset($_SESSION['id'], $_SESSION['role'])) {
    $_SESSION['mensagem_login_redirect'] = "Acesso restrito. Faça login para continuar.";
    header("Location: login.php");
    exit();
}

$role_sessao = strtolower($_SESSION['role'] ?? ''); // Normaliza para minúsculas
$id_usuario_sessao = (int)($_SESSION['id'] ?? 0);

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header("Location: index.php"); 
    exit;
}

// Validação CSRF
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    $_SESSION['mensagem_geral'] = "Erro de validação de segurança. Ação cancelada.";
    $_SESSION['tipo_mensagem_geral'] = "danger";
    header("Location: index.php");
    exit();
}

// --- Coleta e Validação de Dados ---
$id_empresa_editar = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);
$erros_form_post = [];

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

// Autorização: Garante que a empresa edite a si mesma, ou que seja um admin
$is_admin = ($role_sessao === 'administrador' || $role_sessao === 'administradores');
if (!$is_admin && $id_empresa_editar !== $id_usuario_sessao) {
    $_SESSION['mensagem_painel'] = "Você só pode editar os dados da sua própria empresa.";
    $_SESSION['tipo_mensagem_painel'] = "danger";
    header("Location: painel-de-gestao-empresa.php");
    exit();
}

// --- Coleta e Sanitização 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'] ?? '');
$tipo_anuncio_admin  = $is_admin ? trim($_POST['tipo_anuncio'] ?? null) : null;
$role_admin_para_empresa = $is_admin ? trim($_POST['role'] ?? null) : null;

// --- Verificação do Plano (Crucial para permitir upload) ---
$stmt_plano = $pdo->prepare("SELECT tipo_plano FROM Empresas WHERE id = ?");
$stmt_plano->execute([$id_empresa_editar]);
$dados_plano = $stmt_plano->fetch(PDO::FETCH_ASSOC);
$is_pago = (strtolower($dados_plano['tipo_plano'] ?? 'gratuito') === 'pago');

// --- Validações de Negócio ---
if (empty($nome_empresa)) $erros_form_post['nome_empresa'] = "Nome da empresa é obrigatório.";
if (empty($contato)) $erros_form_post['contato'] = "Nome do contato é obrigatório.";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $erros_form_post['email'] = "Formato de e-mail inválido.";
} else {
    $stmt_check_email = $pdo->prepare("SELECT id FROM Empresas WHERE email = :email AND id != :id");
    $stmt_check_email->execute([':email' => $email, ':id' => $id_empresa_editar]);
    if ($stmt_check_email->fetch()) {
        $erros_form_post['email'] = "Este e-mail já está cadastrado para outra empresa.";
    }
}

// Função de validação de CNPJ
if (!function_exists('validar_cnpj')) {
    function validar_cnpj($cnpj) {
        $cnpj = preg_replace('/[^0-9]/', '', (string) $cnpj);
        if (strlen($cnpj) != 14 || preg_match('/(\d)\1{13}/', $cnpj)) return false;
        for ($i = 0, $j = 5, $soma = 0; $i < 12; $i++) {
            $soma += $cnpj[$i] * $j;
            $j = ($j == 2) ? 9 : $j - 1;
        }
        $resto = $soma % 11;
        if ($cnpj[12] != ($resto < 2 ? 0 : 11 - $resto)) return false;
        for ($i = 0, $j = 6, $soma = 0; $i < 13; $i++) {
            $soma += $cnpj[$i] * $j;
            $j = ($j == 2) ? 9 : $j - 1;
        }
        $resto = $soma % 11;
        return $cnpj[13] == ($resto < 2 ? 0 : 11 - $resto);
    }
}
if (!validar_cnpj($cnpj_input)) $erros_form_post['cnpj'] = "CNPJ inválido.";

$nova_senha_hashed_db = null;
if (!empty($senha_nova_input)) {
    if (strlen($senha_nova_input) < 6) {
        $erros_form_post['senha'] = "A nova senha deve ter pelo menos 6 caracteres.";
    } else {
        $nova_senha_hashed_db = password_hash($senha_nova_input, PASSWORD_BCRYPT);
    }
}

// --- LÓGICA DE UPLOAD DE LOGOTIPO (APENAS PARA PLANO PAGO) ---
$logotipo_caminho_para_db = $logotipo_atual_hidden;

if ($is_pago && isset($_FILES['logotipo']) && $_FILES['logotipo']['error'] === UPLOAD_ERR_OK) {
    $upload_dir = 'uploads/logo/';
    if (!is_dir($upload_dir)) {
        mkdir($upload_dir, 0775, true);
    }

    $finfo = new Finfo(FILEINFO_MIME_TYPE);
    $mime_type = $finfo->file($_FILES['logotipo']['tmp_name']);
    $allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp'];

    if (!in_array($mime_type, $allowed_types)) {
        $erros_form_post['logotipo'] = 'Formato inválido (JPG, PNG, GIF, BMP).';
    } else {
        $ext = pathinfo($_FILES['logotipo']['name'], PATHINFO_EXTENSION);
        $novo_nome = 'logo_' . uniqid() . '.' . strtolower($ext);
        $destino = $upload_dir . $novo_nome;

        if (move_uploaded_file($_FILES['logotipo']['tmp_name'], $destino)) {
            $logotipo_caminho_para_db = $destino;
            // Opcional: deletar arquivo físico antigo se desejar limpar o servidor
        } else {
            $erros_form_post['logotipo'] = 'Falha ao salvar arquivo no servidor.';
        }
    }
}

// Se houver erros, volta para o formulário
if (!empty($erros_form_post)) {
    $_SESSION['form_errors_edit_empresa'] = $erros_form_post;
    $_SESSION['form_data_edit_empresa'] = $_POST;
    header("Location: editar_empresa.php?id=" . $id_empresa_editar);
    exit;
}

// --- ATUALIZAÇÃO NO BANCO DE DADOS ---
try {
    $pdo->beginTransaction();

    $campos = [
        'nome_empresa' => $nome_empresa,
        'contato' => $contato,
        'setor_departamento' => $setor_departamento,
        'email' => $email,
        'login' => $email,
        'telefone_comercial' => $telefone_comercial,
        'celular' => $celular,
        'cidade' => $cidade,
        'estado' => $estado,
        'cnpj' => $cnpj_input,
        'logotipo' => $logotipo_caminho_para_db
    ];

    if ($nova_senha_hashed_db) {
        $campos['senha'] = $nova_senha_hashed_db;
    }
    if ($is_admin) {
        if ($tipo_anuncio_admin !== null) $campos['tipo_anuncio'] = $tipo_anuncio_admin;
        if ($role_admin_para_empresa !== null) $campos['role'] = $role_admin_para_empresa;
    }

    $set_parts = [];
    foreach ($campos as $key => $val) {
        $set_parts[] = "`$key` = :$key";
    }

    $sql = "UPDATE Empresas SET " . implode(", ", $set_parts) . " WHERE id = :id_match";
    $stmt = $pdo->prepare($sql);
    
    $campos['id_match'] = $id_empresa_editar;
    $stmt->execute($campos);

    // Sincroniza logo nos anúncios pagos
    if ($logotipo_caminho_para_db !== $logotipo_atual_hidden) {
        $stmt_logos = $pdo->prepare("UPDATE anuncio_pago SET logotipo = ? WHERE empresa_id = ?");
        $stmt_logos->execute([$logotipo_caminho_para_db, $id_empresa_editar]);
    }

    $pdo->commit();

    $_SESSION['mensagem_edit_empresa'] = "Empresa atualizada com sucesso!";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'success';
    
    $redirect = $is_admin ? "listar_empresas.php" : "editar_empresa.php?id={$id_empresa_editar}";
    header("Location: " . $redirect);
    exit();

} catch (PDOException $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    error_log("Erro ao salvar: " . $e->getMessage());
    $_SESSION['mensagem_edit_empresa'] = "Erro no banco de dados. Tente novamente.";
    $_SESSION['tipo_mensagem_edit_empresa'] = 'danger';
    header("Location: editar_empresa.php?id=" . $id_empresa_editar);
    exit();
}