<?php
// ============================================================
// ERP - ActSafe | Configurações do Sistema
// Desenvolvido por Antônio da Luz
// ============================================================

// --- Banco de Dados ---
// ATENÇÃO: Altere estas credenciais no cPanel
define('DB_HOST', 'localhost');
define('DB_NAME', 'agendaex_isafe');
define('DB_USER', 'agendaex_admin');         // Altere para o usuário do cPanel
define('DB_PASS', 'Admin@1251');             // Altere para a senha do cPanel
define('DB_CHARSET', 'utf8mb4');

// --- Sistema ---
define('APP_NAME', 'ERP - ActSafe');
define('APP_VERSION', '1.0.0');
define('APP_AUTHOR', 'Antônio da Luz');
define('APP_URL', 'https://nr12.agendaexecutiva360.com/isafe'); // Altere para seu domínio

// --- Upload de Arquivos ---
define('UPLOAD_DIR', __DIR__ . '/../4_storage/uploads/');
define('UPLOAD_URL', APP_URL . '/4_storage/uploads/');
define('MAX_UPLOAD_MB', 20);
define('ALLOWED_EXTENSIONS', ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'png', 'jpg', 'jpeg', 'gif']);

// --- Sessão ---
define('SESSION_NAME', 'actsafe_session');
define('SESSION_LIFETIME', 28800); // 8 horas

// --- Segurança ---
define('BCRYPT_COST', 12);

// ============================================================
// Conexão PDO com o banco de dados
// ============================================================
function getDB(): PDO {
    static $pdo = null;
    if ($pdo === null) {
        try {
            $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
            $options = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $pdo = new PDO($dsn, DB_USER, DB_PASS, $options);
        } catch (PDOException $e) {
            die(json_encode(['erro' => 'Falha na conexão com o banco de dados: ' . $e->getMessage()]));
        }
    }
    return $pdo;
}

// ============================================================
// Inicializar sessão segura
// ============================================================
function iniciarSessao(): void {
    if (session_status() === PHP_SESSION_NONE) {
        session_name(SESSION_NAME);
        session_set_cookie_params([
            'lifetime' => SESSION_LIFETIME,
            'path'     => '/',
            'secure'   => isset($_SERVER['HTTPS']),
            'httponly' => true,
            'samesite' => 'Strict',
        ]);
        session_start();
    }
}

// ============================================================
// Verificar autenticação
// ============================================================
function verificarAuth(): array {
    iniciarSessao();
    if (empty($_SESSION['usuario_id'])) {
        header('Location: ' . APP_URL . '/index.php');
        exit;
    }
    return [
        'id'     => $_SESSION['usuario_id'],
        'nome'   => $_SESSION['usuario_nome'],
        'email'  => $_SESSION['usuario_email'],
        'perfil' => $_SESSION['usuario_perfil'],
    ];
}

// ============================================================
// Inicializar Auditoria
// ============================================================
require_once __DIR__ . '/auditoria.php';

$usuario_atual = null;
if (session_status() === PHP_SESSION_ACTIVE && !empty($_SESSION['usuario_id'])) {
    $usuario_atual = [
        'id'     => $_SESSION['usuario_id'],
        'nome'   => $_SESSION['usuario_nome'],
        'perfil' => $_SESSION['usuario_perfil'],
    ];
    Auditoria::inicializar(
        getDB(),
        $usuario_atual['id'],
        $usuario_atual['nome'],
        $usuario_atual['perfil']
    );
}

// ============================================================
// Verificar permissão por perfil
// ============================================================
function temPermissao(string $acao, string $perfil): bool {
    $permissoes = [
        'criar'   => ['admin', 'tecnico'],
        'editar'  => ['admin', 'tecnico'],
        'excluir' => ['admin'],
        'ver'     => ['admin', 'diretor_geral', 'gestor_unidade', 'tecnico'],
    ];
    return in_array($perfil, $permissoes[$acao] ?? []);
}

// ============================================================
// Obter IDs das unidades acessíveis pelo usuário
// Retorna NULL se o perfil tem acesso a TODAS as unidades
// Retorna array (pode ser vazio) se acesso é restrito
// ============================================================
function getUnidadesAcessiveis(int $usuarioId, string $perfil): ?array {
    if ($perfil === 'admin' || $perfil === 'diretor_geral') {
        return null; // Acesso total — sem filtro
    }
    $db = getDB();
    $stmt = $db->prepare("SELECT unidade_id FROM usuarios_unidades WHERE usuario_id = ?");
    $stmt->execute([$usuarioId]);
    return array_column($stmt->fetchAll(), 'unidade_id');
}

// ============================================================
// Gerar cláusula SQL WHERE para filtro de unidade
// Uso: [$where, $params] = filtroUnidade($usuario)
// ============================================================
function filtroUnidade(array $usuario, string $alias = ''): array {
    $col = $alias ? "{$alias}.unidade_id" : 'unidade_id';
    $ids = getUnidadesAcessiveis($usuario['id'], $usuario['perfil']);
    if ($ids === null) {
        return ['1=1', []]; // Sem restrição
    }
    if (empty($ids)) {
        return ['1=0', []]; // Sem acesso a nenhuma unidade
    }
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    return ["{$col} IN ({$placeholders})", $ids];
}

// ============================================================
// Verificar acesso à unidade
// ============================================================
function temAcessoUnidade(int $unidadeId, int $usuarioId, string $perfil): bool {
    if ($perfil === 'admin' || $perfil === 'diretor_geral') return true;
    $db = getDB();
    $stmt = $db->prepare("SELECT id FROM usuarios_unidades WHERE usuario_id = ? AND unidade_id = ?");
    $stmt->execute([$usuarioId, $unidadeId]);
    return $stmt->fetch() !== false;
}

// ============================================================
// Sanitizar entrada
// ============================================================
// sanitizar(): usa APENAS para exibir dados na tela (previne XSS)
// Para salvar no banco, use limpar() que apenas remove espaços extras
// ============================================================
function sanitizar(string $valor): string {
    return htmlspecialchars(trim($valor), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

// limpar(): limpa entrada para gravar no banco (sem converter caracteres especiais)
function limpar(string $valor): string {
    return trim(strip_tags($valor));
}

// ============================================================
// Formatar data para exibição (BR)
// ============================================================
function formatarData(?string $data): string {
    if (!$data) return '—';
    $d = DateTime::createFromFormat('Y-m-d', $data);
    return $d ? $d->format('d/m/Y') : $data;
}

// ============================================================
// Verificar se documento está vencido ou vencendo
// ============================================================
function statusVencimento(?string $dataVencimento): string {
    if (!$dataVencimento) return '';
    $hoje = new DateTime();
    $venc = new DateTime($dataVencimento);
    $diff = $hoje->diff($venc)->days;
    if ($venc < $hoje) return 'vencido';
    if ($diff <= 30) return 'vencendo';
    return 'ok';
}
