<?php
/**
 * Helper para Chat de Suporte
 * 
 * Funções auxiliares para gerenciar chat entre admin e usuários
 */

// Garantir que a conexão do banco está disponível
if (!isset($pdo)) {
    require_once __DIR__ . '/../config/config_db.php';
}

require_once __DIR__ . '/auth_helper.php';

/**
 * Verifica se o chat está habilitado
 * 
 * @return bool
 */
function chat_habilitado() {
    global $pdo;
    
    try {
        $stmt = $pdo->query("SELECT chat_habilitado FROM chat_config LIMIT 1");
        $config = $stmt->fetch(PDO::FETCH_ASSOC);
        return $config && intval($config['chat_habilitado']) === 1;
    } catch (PDOException $e) {
        error_log("Erro ao verificar status do chat: " . $e->getMessage());
        return false;
    }
}

/**
 * Habilita ou desabilita o chat
 * 
 * @param bool $habilitado
 * @return bool
 */
function definir_status_chat($habilitado) {
    global $pdo;
    
    try {
        $stmt = $pdo->prepare("UPDATE chat_config SET chat_habilitado = ? WHERE id = 1");
        $stmt->execute([$habilitado ? 1 : 0]);
        return true;
    } catch (PDOException $e) {
        error_log("Erro ao definir status do chat: " . $e->getMessage());
        return false;
    }
}

/**
 * Cria ou retorna uma conversa existente para o usuário
 * 
 * @param int $usuario_id ID do usuário
 * @return int ID da conversa
 */
function obter_ou_criar_conversa($usuario_id) {
    global $pdo;
    
    try {
        // Verificar se já existe uma conversa aberta
        $stmt = $pdo->prepare("
            SELECT id FROM chat_conversas 
            WHERE usuario_id = ? 
            AND status IN ('aberta', 'em_atendimento')
            ORDER BY created_at DESC
            LIMIT 1
        ");
        $stmt->execute([$usuario_id]);
        $conversa = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if ($conversa) {
            return intval($conversa['id']);
        }
        
        // Criar nova conversa
        $stmt = $pdo->prepare("
            INSERT INTO chat_conversas (usuario_id, status, created_at)
            VALUES (?, 'aberta', NOW())
        ");
        $stmt->execute([$usuario_id]);
        
        return intval($pdo->lastInsertId());
    } catch (PDOException $e) {
        error_log("Erro ao obter/criar conversa: " . $e->getMessage());
        return 0;
    }
}

/**
 * Envia uma mensagem no chat
 * 
 * @param int $conversa_id ID da conversa
 * @param int $remetente_id ID do remetente
 * @param string $tipo_remetente 'usuario' ou 'admin'
 * @param string $mensagem Texto da mensagem
 * @param string|null $arquivo_url URL do arquivo anexado
 * @return bool
 */
function enviar_mensagem_chat($conversa_id, $remetente_id, $tipo_remetente, $mensagem, $arquivo_url = null) {
    global $pdo;
    
    try {
        // Garantir que mensagem não seja null
        $mensagem = trim($mensagem ?? '');
        
        // Validar parâmetros
        if (empty($conversa_id) || $conversa_id <= 0) {
            error_log("Erro: conversa_id inválido: " . $conversa_id);
            return false;
        }
        
        if (empty($remetente_id) || $remetente_id <= 0) {
            error_log("Erro: remetente_id inválido: " . $remetente_id);
            return false;
        }
        
        if (empty($tipo_remetente) || !in_array($tipo_remetente, ['usuario', 'admin'])) {
            error_log("Erro: tipo_remetente inválido: " . $tipo_remetente);
            return false;
        }
        
        // Verificar se a coluna arquivo_url existe
        try {
            $stmt_check = $pdo->query("SHOW COLUMNS FROM chat_mensagens LIKE 'arquivo_url'");
            $coluna_existe = $stmt_check->rowCount() > 0;
        } catch (PDOException $e) {
            // Se der erro, assumir que não existe
            $coluna_existe = false;
        }
        
        if ($coluna_existe) {
            $stmt = $pdo->prepare("
                INSERT INTO chat_mensagens (conversa_id, remetente_id, tipo_remetente, mensagem, arquivo_url, created_at)
                VALUES (?, ?, ?, ?, ?, NOW())
            ");
            $result = $stmt->execute([$conversa_id, $remetente_id, $tipo_remetente, $mensagem, $arquivo_url]);
        } else {
            // Fallback se a coluna não existir
            $stmt = $pdo->prepare("
                INSERT INTO chat_mensagens (conversa_id, remetente_id, tipo_remetente, mensagem, created_at)
                VALUES (?, ?, ?, ?, NOW())
            ");
            $result = $stmt->execute([$conversa_id, $remetente_id, $tipo_remetente, $mensagem]);
        }
        
        if (!$result) {
            error_log("Erro: execute() retornou false ao inserir mensagem");
            return false;
        }
        
        // Atualizar última mensagem da conversa
        try {
            $stmt_update = $pdo->prepare("
                UPDATE chat_conversas 
                SET ultima_mensagem_at = NOW(), updated_at = NOW()
                WHERE id = ?
            ");
            $stmt_update->execute([$conversa_id]);
        } catch (PDOException $e) {
            // Log mas não falha se não conseguir atualizar
            error_log("Aviso: não foi possível atualizar última mensagem: " . $e->getMessage());
        }
        
        return true;
    } catch (PDOException $e) {
        error_log("Erro ao enviar mensagem: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        return false;
    } catch (Exception $e) {
        error_log("Erro geral ao enviar mensagem: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        return false;
    }
}

/**
 * Busca mensagens de uma conversa
 * 
 * @param int $conversa_id ID da conversa
 * @param string $ultima_mensagem_id ID da última mensagem recebida (para buscar apenas novas)
 * @return array
 */
function buscar_mensagens_chat($conversa_id, $ultima_mensagem_id = null) {
    global $pdo;
    
    try {
        // Verificar se coluna arquivo_url existe
        try {
            $stmt_check = $pdo->query("SHOW COLUMNS FROM chat_mensagens LIKE 'arquivo_url'");
            $coluna_existe = $stmt_check->rowCount() > 0;
        } catch (PDOException $e) {
            $coluna_existe = false;
        }
        
        if ($ultima_mensagem_id) {
            if ($coluna_existe) {
                $stmt = $pdo->prepare("
                    SELECT id, remetente_id, tipo_remetente, mensagem, arquivo_url, created_at
                    FROM chat_mensagens
                    WHERE conversa_id = ? AND id > ?
                    ORDER BY created_at ASC
                ");
            } else {
                $stmt = $pdo->prepare("
                    SELECT id, remetente_id, tipo_remetente, mensagem, created_at
                    FROM chat_mensagens
                    WHERE conversa_id = ? AND id > ?
                    ORDER BY created_at ASC
                ");
            }
            $stmt->execute([$conversa_id, $ultima_mensagem_id]);
        } else {
            if ($coluna_existe) {
                $stmt = $pdo->prepare("
                    SELECT id, remetente_id, tipo_remetente, mensagem, arquivo_url, created_at
                    FROM chat_mensagens
                    WHERE conversa_id = ?
                    ORDER BY created_at ASC
                ");
            } else {
                $stmt = $pdo->prepare("
                    SELECT id, remetente_id, tipo_remetente, mensagem, created_at
                    FROM chat_mensagens
                    WHERE conversa_id = ?
                    ORDER BY created_at ASC
                ");
            }
            $stmt->execute([$conversa_id]);
        }
        
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        error_log("Erro ao buscar mensagens: " . $e->getMessage());
        return [];
    }
}

/**
 * Marca mensagens como lidas
 * 
 * @param int $conversa_id ID da conversa
 * @param int $usuario_id ID do usuário que está lendo
 */
function marcar_mensagens_lidas($conversa_id, $usuario_id) {
    global $pdo;
    
    try {
        // Buscar tipo do usuário
        $stmt_user = $pdo->prepare("SELECT tipo FROM usuarios WHERE id = ? LIMIT 1");
        $stmt_user->execute([$usuario_id]);
        $user = $stmt_user->fetch(PDO::FETCH_ASSOC);
        $tipo_oposto = $user['tipo'] === 'admin' ? 'usuario' : 'admin';
        
        // Marcar mensagens do tipo oposto como lidas
        $stmt = $pdo->prepare("
            UPDATE chat_mensagens 
            SET lida = 1
            WHERE conversa_id = ? 
            AND tipo_remetente = ?
            AND lida = 0
        ");
        $stmt->execute([$conversa_id, $tipo_oposto]);
    } catch (PDOException $e) {
        error_log("Erro ao marcar mensagens como lidas: " . $e->getMessage());
    }
}

/**
 * Busca todas as conversas (para admin)
 * 
 * @return array
 */
function buscar_conversas_admin() {
    global $pdo;
    
    try {
        $stmt = $pdo->query("
            SELECT 
                c.id,
                c.usuario_id,
                c.admin_id,
                c.status,
                c.ultima_mensagem_at,
                c.created_at,
                u.nome as usuario_nome,
                u.email as usuario_email,
                COUNT(CASE WHEN m.lida = 0 AND m.tipo_remetente = 'usuario' THEN 1 END) as mensagens_nao_lidas
            FROM chat_conversas c
            INNER JOIN usuarios u ON u.id = c.usuario_id
            LEFT JOIN chat_mensagens m ON m.conversa_id = c.id
            GROUP BY c.id
            ORDER BY c.ultima_mensagem_at DESC, c.created_at DESC
        ");
        
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        error_log("Erro ao buscar conversas: " . $e->getMessage());
        return [];
    }
}

/**
 * Finaliza uma conversa e apaga todas as mensagens
 * 
 * @param int $conversa_id ID da conversa
 * @return bool
 */
function finalizar_chat($conversa_id) {
    global $pdo;
    
    try {
        // Apagar todas as mensagens da conversa
        $stmt = $pdo->prepare("DELETE FROM chat_mensagens WHERE conversa_id = ?");
        $stmt->execute([$conversa_id]);
        
        // Fechar a conversa
        $stmt = $pdo->prepare("
            UPDATE chat_conversas 
            SET status = 'fechada', updated_at = NOW()
            WHERE id = ?
        ");
        $stmt->execute([$conversa_id]);
        
        return true;
    } catch (PDOException $e) {
        error_log("Erro ao finalizar chat: " . $e->getMessage());
        return false;
    }
}

/**
 * Busca foto de perfil de um usuário
 * 
 * @param int $usuario_id ID do usuário
 * @return string|null URL da foto ou null
 */
function obter_foto_perfil_usuario($usuario_id) {
    global $pdo;
    
    try {
        $stmt = $pdo->prepare("SELECT foto_perfil FROM usuarios WHERE id = ? LIMIT 1");
        $stmt->execute([$usuario_id]);
        $dados = $stmt->fetch(PDO::FETCH_ASSOC);
        return $dados['foto_perfil'] ?? null;
    } catch (PDOException $e) {
        error_log("Erro ao buscar foto de perfil: " . $e->getMessage());
        return null;
    }
}

