# Sistema de Mensagens - MediConnect

## 📋 Status da Implementação

### ✅ Completado

1. **Tabela `messages` criada no Supabase**
   - Campos: id, sender_id, receiver_id, content, read, created_at
   - Localização: schema `public`
   - RLS desabilitado para testes

2. **Funções SQL/RPC criadas**
   - `send_message(p_sender_id, p_receiver_id, p_content)` - Envia mensagem
   - `get_messages_between_users(p_user1_id, p_user2_id)` - Busca mensagens entre dois usuários

3. **Código Frontend implementado**
   - `src/services/messages/messageService.ts` - Serviço atualizado para usar RPC
   - `src/components/ChatMessages.tsx` - Componente de chat criado
   - `src/pages/PainelMedico.tsx` - Integrado sistema de mensagens
   - `src/pages/AcompanhamentoPaciente.tsx` - Integrado sistema de mensagens

### ❌ Problema Atual

**O PostgREST do Supabase não está expondo as funções RPC via API REST**

Erro: `404 (Not Found)` ao chamar `/rest/v1/rpc/send_message`

Mesmo após:
- Pausar e retomar o projeto
- Desligar e ligar Data API
- Executar `NOTIFY pgrst, 'reload schema'`
- Verificar que as funções existem no banco (verificado ✓)
- Adicionar schema `public` nos Exposed schemas

## 🔧 Soluções Possíveis

### Opção 1: Aguardar Cache Expirar (24-48h)
O cache do PostgREST em projetos gratuitos pode levar até 48 horas para atualizar automaticamente.

**Passos:**
1. Aguarde 24-48 horas
2. Recarregue a página do aplicativo
3. Teste enviar uma mensagem

### Opção 2: Criar Novo Projeto Supabase
Criar tudo do zero em um projeto novo geralmente resolve o problema de cache.

**Passos:**
1. Crie um novo projeto no Supabase
2. Execute o script completo abaixo
3. Atualize as credenciais em `src/lib/supabase.ts`

### Opção 3: Contatar Suporte Supabase
Peça para o suporte fazer restart manual do PostgREST.

**Link:** https://supabase.com/dashboard/support

## 📝 Script SQL Completo

Execute este script em um **novo projeto Supabase** ou aguarde o cache expirar:

```sql
-- ========================================
-- SCRIPT COMPLETO - SISTEMA DE MENSAGENS
-- ========================================

-- 1. Criar tabela messages
CREATE TABLE public.messages (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  sender_id UUID NOT NULL,
  receiver_id UUID NOT NULL,
  content TEXT NOT NULL,
  read BOOLEAN DEFAULT false,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- 2. Criar índices
CREATE INDEX idx_messages_sender ON public.messages(sender_id);
CREATE INDEX idx_messages_receiver ON public.messages(receiver_id);
CREATE INDEX idx_messages_created_at ON public.messages(created_at DESC);
CREATE INDEX idx_messages_conversation ON public.messages(sender_id, receiver_id, created_at DESC);

-- 3. Desabilitar RLS (para testes)
ALTER TABLE public.messages DISABLE ROW LEVEL SECURITY;

-- 4. Permissões
GRANT ALL ON public.messages TO anon, authenticated, service_role;

-- 5. Função para enviar mensagem
CREATE OR REPLACE FUNCTION public.send_message(
  p_sender_id UUID,
  p_receiver_id UUID,
  p_content TEXT
)
RETURNS TABLE (
  id UUID,
  sender_id UUID,
  receiver_id UUID,
  content TEXT,
  read BOOLEAN,
  created_at TIMESTAMPTZ
) 
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
  RETURN QUERY
  INSERT INTO public.messages (sender_id, receiver_id, content, read, created_at)
  VALUES (p_sender_id, p_receiver_id, p_content, false, now())
  RETURNING messages.id, messages.sender_id, messages.receiver_id, 
            messages.content, messages.read, messages.created_at;
END;
$$;

-- 6. Função para buscar mensagens
CREATE OR REPLACE FUNCTION public.get_messages_between_users(
  p_user1_id UUID,
  p_user2_id UUID
)
RETURNS TABLE (
  id UUID,
  sender_id UUID,
  receiver_id UUID,
  content TEXT,
  read BOOLEAN,
  created_at TIMESTAMPTZ
) 
LANGUAGE sql
SECURITY DEFINER
AS $$
  SELECT id, sender_id, receiver_id, content, read, created_at
  FROM public.messages
  WHERE (sender_id = p_user1_id AND receiver_id = p_user2_id)
     OR (sender_id = p_user2_id AND receiver_id = p_user1_id)
  ORDER BY created_at ASC;
$$;

-- 7. Permissões nas funções
GRANT EXECUTE ON FUNCTION public.send_message TO anon, authenticated, service_role;
GRANT EXECUTE ON FUNCTION public.get_messages_between_users TO anon, authenticated, service_role;

-- 8. Reload do PostgREST
NOTIFY pgrst, 'reload schema';
NOTIFY pgrst, 'reload config';

-- 9. Verificação
SELECT 'Tabela criada:' as status, COUNT(*) as existe 
FROM information_schema.tables 
WHERE table_name = 'messages' AND table_schema = 'public';

SELECT 'Funções criadas:' as status, COUNT(*) as total
FROM information_schema.routines 
WHERE routine_schema = 'public' 
AND routine_name IN ('send_message', 'get_messages_between_users');
```

## ⚙️ Configuração do Dashboard Supabase

Após executar o script SQL:

### 1. Settings → Data API
- ✅ **Enable Data API** deve estar LIGADO (verde)
- ✅ **Exposed schemas** deve conter: `public`
- Clique em **Save**

### 2. Testar Função via Dashboard
Vá em **SQL Editor** e teste:

```sql
-- Teste send_message
SELECT * FROM public.send_message(
  '00000000-0000-0000-0000-000000000001'::uuid,
  '00000000-0000-0000-0000-000000000002'::uuid,
  'Teste de mensagem'
);

-- Teste get_messages_between_users
SELECT * FROM public.get_messages_between_users(
  '00000000-0000-0000-0000-000000000001'::uuid,
  '00000000-0000-0000-0000-000000000002'::uuid
);
```

Se funcionar no SQL Editor mas não via API, é problema de cache do PostgREST.

## 🚀 Como Usar no Aplicativo

### Médico enviando mensagem para Paciente

1. Login como médico no sistema
2. Clique em **"Mensagens"** no menu lateral
3. Na seção **"Iniciar nova conversa"**, clique em um paciente
4. Digite a mensagem no campo inferior
5. Clique em **"Enviar"**

### Paciente enviando mensagem para Médico

1. Login como paciente no sistema
2. Clique em **"Mensagens"** no menu lateral
3. Na seção **"Iniciar nova conversa"**, clique em um médico
4. Digite a mensagem no campo inferior
5. Clique em **"Enviar"**

## 🐛 Troubleshooting

### Erro: "Could not find the function public.send_message"

**Causa:** PostgREST não reconhece a função (problema de cache)

**Soluções:**
1. Aguarde 24-48 horas
2. Pause e retome o projeto: Settings → General → Pause project
3. Desligue e ligue Data API: Settings → Data API → Toggle switch
4. Crie novo projeto Supabase

### Erro: "404 (Not Found)"

**Causa:** PostgREST não está expondo a função via REST API

**Verificações:**
```sql
-- Verificar se função existe
SELECT routine_name FROM information_schema.routines 
WHERE routine_schema = 'public' AND routine_name = 'send_message';

-- Verificar permissões
SELECT grantee, privilege_type 
FROM information_schema.routine_privileges 
WHERE routine_name = 'send_message';
```

### Erro: "Erro ao carregar conversas"

**Status:** Normal - a funcionalidade de listar conversas foi temporariamente desabilitada
devido ao problema de cache. Você ainda pode:
- Selecionar usuários da lista "Iniciar nova conversa"
- Enviar e receber mensagens
- As mensagens serão salvas no banco

## 📁 Arquivos Modificados

```
src/
├── components/
│   └── ChatMessages.tsx              ✅ NOVO - Componente de chat
├── services/
│   └── messages/
│       └── messageService.ts         ✅ ATUALIZADO - Agora usa RPC
├── pages/
│   ├── PainelMedico.tsx             ✅ ATUALIZADO - Integrado chat
│   └── AcompanhamentoPaciente.tsx   ✅ ATUALIZADO - Integrado chat
scripts/
├── create-messages-table.sql         ✅ NOVO - Script inicial
├── force-schema-reload.sql           ✅ NOVO - Script de correção
└── fix-messages-permissions.sql      ✅ NOVO - Script de permissões
```

## 🎯 Próximos Passos (quando funcionar)

1. **Habilitar RLS (Row Level Security)**
```sql
ALTER TABLE public.messages ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Users can view their messages"
  ON public.messages FOR SELECT
  USING (auth.uid() = sender_id OR auth.uid() = receiver_id);

CREATE POLICY "Users can send messages"
  ON public.messages FOR INSERT
  WITH CHECK (auth.uid() = sender_id);
```

2. **Adicionar Realtime (mensagens instantâneas)**
```sql
ALTER PUBLICATION supabase_realtime ADD TABLE public.messages;
```

3. **Implementar notificações**
   - Badge com contador de mensagens não lidas
   - Som ao receber mensagem
   - Desktop notifications

4. **Melhorias de UX**
   - Upload de arquivos/imagens
   - Emojis
   - Indicador "digitando..."
   - Confirmação de leitura (duas marcas azuis)

## 📞 Suporte

Se após 48 horas ainda não funcionar:

1. **Suporte Supabase:** https://supabase.com/dashboard/support
2. **Discord Supabase:** https://discord.supabase.com
3. **GitHub Issues:** Relate o problema de cache do PostgREST

## ✅ Checklist Final

Antes de considerar completo:

- [ ] Script SQL executado sem erros
- [ ] Funções aparecem em `information_schema.routines`
- [ ] Data API está habilitada
- [ ] Schema `public` está nos Exposed schemas  
- [ ] Teste via SQL Editor funciona
- [ ] Aguardou 24-48h OU criou novo projeto
- [ ] Aplicativo consegue enviar mensagem sem erro 404
- [ ] Mensagem aparece no banco de dados
- [ ] Mensagem aparece na interface do destinatário

---

**Data de criação:** 21/11/2025  
**Status:** 99% completo - aguardando resolução de cache do PostgREST  
**Próxima ação:** Aguardar 24-48h ou criar novo projeto Supabase
