# 🔥 Configuração do Firebase - Mapa Memorial

## Índice
1. [Criar Projeto no Firebase](#1-criar-projeto-no-firebase)
2. [Configurar Authentication](#2-configurar-authentication)
3. [Configurar Firestore](#3-configurar-firestore)
4. [Obter Configurações](#4-obter-configurações)
5. [Configurar no Projeto](#5-configurar-no-projeto)
6. [Criar Usuário Administrador](#6-criar-usuário-administrador)
7. [Regras de Segurança](#7-regras-de-segurança)
8. [Deploy](#8-deploy)

---

## 1. Criar Projeto no Firebase

1. Acesse [Firebase Console](https://console.firebase.google.com/)
2. Clique em **"Adicionar projeto"**
3. Digite o nome do projeto: `mapa-memorial`
4. Desative o Google Analytics (opcional para este projeto)
5. Clique em **"Criar projeto"**

---

## 2. Configurar Authentication

1. No menu lateral, clique em **"Authentication"**
2. Clique em **"Começar"**
3. Na aba **"Sign-in method"**, clique em **"E-mail/senha"**
4. Ative **"E-mail/senha"** (primeiro toggle)
5. Clique em **"Salvar"**

---

## 3. Configurar Firestore

1. No menu lateral, clique em **"Firestore Database"**
2. Clique em **"Criar banco de dados"**
3. Selecione **"Iniciar no modo de teste"** (vamos ajustar as regras depois)
4. Escolha a região: **`southamerica-east1` (São Paulo)**
5. Clique em **"Habilitar"**

---

## 4. Obter Configurações

1. Clique no ícone de engrenagem ⚙️ > **"Configurações do projeto"**
2. Role até **"Seus aplicativos"**
3. Clique no ícone **`</>`** (Web)
4. Digite o apelido: `mapa-memorial-web`
5. **Não** marque "Firebase Hosting" por enquanto
6. Clique em **"Registrar app"**
7. Copie o objeto `firebaseConfig`:

```javascript
const firebaseConfig = {
  apiKey: "AIza...",
  authDomain: "seu-projeto.firebaseapp.com",
  projectId: "seu-projeto",
  storageBucket: "seu-projeto.appspot.com",
  messagingSenderId: "123456789",
  appId: "1:123456789:web:abc123"
};
```

---

## 5. Configurar no Projeto

1. Abra o arquivo `firebase-config.js`
2. Substitua os valores de exemplo pelas suas configurações reais:

```javascript
const firebaseConfig = {
    apiKey: "SUA_API_KEY_REAL",
    authDomain: "seu-projeto.firebaseapp.com",
    projectId: "seu-projeto",
    storageBucket: "seu-projeto.appspot.com",
    messagingSenderId: "SEU_SENDER_ID",
    appId: "SEU_APP_ID"
};
```

---

## 6. Criar Usuário Administrador

### Opção A: Pelo Console do Firebase

1. Vá em **Authentication** > **Users**
2. Clique em **"Adicionar usuário"**
3. Digite o email e senha do administrador
4. Anote o **UID** do usuário criado

### Opção B: Pela Interface Web

1. Acesse `login.html` e crie uma conta normalmente
2. Depois, vá ao Firestore e ajuste o `role` para `admin`

### Configurar Perfil de Admin no Firestore

1. Vá em **Firestore Database**
2. Crie a collection `users` (se não existir)
3. Adicione um documento com o **UID do usuário como ID**:

```json
{
  "username": "admin",
  "firstName": "George",
  "lastName": "Cirilo",
  "email": "seu-email@exemplo.com",
  "role": "admin",
  "createdAt": /* timestamp */
}
```

4. Crie a collection `usernames`
5. Adicione um documento com o **username como ID**:

```json
{
  "uid": "UID_DO_USUARIO"
}
```

---

## 7. Regras de Segurança

Vá em **Firestore Database** > **Regras** e substitua pelas regras abaixo:

```javascript
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    
    // Função para verificar se é admin
    function isAdmin() {
      return request.auth != null && 
             get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin';
    }
    
    // Usuários podem ler/escrever seu próprio perfil
    match /users/{userId} {
      allow read: if request.auth != null && request.auth.uid == userId;
      allow write: if request.auth != null && request.auth.uid == userId;
      // Admin pode ler todos
      allow read: if isAdmin();
    }
    
    // Usernames - qualquer autenticado pode ler, escrever apenas no cadastro
    match /usernames/{username} {
      allow read: if true;
      allow create: if request.auth != null;
    }
    
    // Locais pendentes
    match /pendingLocations/{locationId} {
      // Qualquer autenticado pode criar
      allow create: if request.auth != null;
      // Apenas admin pode ler, atualizar, deletar
      allow read, update, delete: if isAdmin();
    }
    
    // Locais aprovados
    match /approvedLocations/{locationId} {
      // Qualquer um pode ler (público)
      allow read: if true;
      // Apenas admin pode criar/atualizar/deletar
      allow write: if isAdmin();
    }
  }
}
```

Clique em **"Publicar"**.

---

## 8. Deploy (Opcional)

### Firebase Hosting

1. Instale o Firebase CLI:
```bash
npm install -g firebase-tools
```

2. Faça login:
```bash
firebase login
```

3. Inicialize o projeto:
```bash
firebase init hosting
```

4. Selecione:
   - Diretório público: `.` (raiz)
   - SPA: `Não`
   - Sobrescrever index.html: `Não`

5. Deploy:
```bash
firebase deploy --only hosting
```

---

## ⚠️ Notas de Segurança

1. **Nunca** compartilhe as credenciais do Firebase publicamente
2. O arquivo `firebase-config.js` contém apenas chaves públicas do Firebase (são seguras para expor no frontend)
3. A segurança real é feita pelas **Regras do Firestore**
4. Mantenha as regras de segurança atualizadas
5. O papel `admin` deve ser atribuído manualmente no Firestore

---

## 📁 Estrutura das Collections

### `users`
```
/users/{uid}
  - username: string
  - firstName: string
  - lastName: string
  - email: string
  - role: "researcher" | "admin"
  - createdAt: timestamp
```

### `usernames`
```
/usernames/{username}
  - uid: string
```

### `pendingLocations`
```
/pendingLocations/{locationId}
  - title: string
  - description: string
  - date: string
  - period: string
  - coordinates: [lat, lng]
  - address: string
  - category: string
  - icon: string
  - tags: array
  - images: array (base64)
  - status: "pending" | "rejected"
  - submittedBy: string
  - submittedByUid: string
  - submittedAt: timestamp
  - reviewedAt: timestamp | null
  - reviewedBy: string | null
  - rejectionReason: string | null
```

### `approvedLocations`
```
/approvedLocations/{locationId}
  - (mesmos campos acima, com status: "approved")
```

---

## 🆘 Suporte

Se encontrar problemas:
1. Verifique se todas as configurações estão corretas
2. Verifique o console do navegador para erros
3. Confirme que Authentication e Firestore estão habilitados
4. Verifique se as regras de segurança permitem as operações

