# TOP MIX CALL — PHP Edition
## Documentação completa do sistema

**Plataforma de entrevistas ao vivo para TOP MIX TV**  
**Stack:** PHP 8+ · MySQL · HTML/CSS · JavaScript (fetch) · Sessões PHP  
**Hospedagem:** Hostinger / cPanel (shared hosting, sem SSH, sem Node.js)

---

## O que é este sistema?

O **TOP MIX CALL** permite que o público entre em uma fila virtual para participar de entrevistas ao vivo na TOP MIX TV. A equipe de produção gerencia quem entra no ar, visualiza a câmera do convidado e integra o sinal com o **vMix** (software de transmissão).

Tudo funciona em **hospedagem compartilhada PHP** — sem servidor Node.js, sem npm, sem Socket.io e sem WebRTC.

### Fluxo resumido

```
CONVIDADO                    PRODUÇÃO                      VMIX
    │                            │                          │
    ▼                            ▼                          ▼
index.php ──► camera.php    painel.php / estudio.php   camera-view.php
(entra fila)  (câmera)      (gerencia fila)           (Browser Input)
```

---

## Estrutura de pastas

```
topmixcall-php/
├── includes/              ← PHP interno (protegido, fora do web root)
│   ├── config.php         ← Credenciais MySQL, sessão
│   ├── init.php           ← Bootstrap APP_ROOT
│   ├── database.php       ← PDO
│   ├── auth.php           ← Login e sessão
│   ├── functions.php      ← CRUD fila/histórico
│   ├── camera_stream.php  ← Frames JPEG, ping, limpeza storage
│   └── .htaccess          ← Deny from all
│
├── storage/               ← Frames temporários (fora do web root)
│   ├── frames/            ← 1 JPEG por chamada (sobrescrito)
│   ├── ping/              ← Status conexão câmera
│   ├── links/             ← Link enviado ao convidado
│   └── .htaccess          ← Bloqueio acesso direto
│
├── api/                   ← Endpoints JSON
├── public/                ← Document root (public_html)
│   ├── index.php          ← Página pública
│   ├── login.php
│   ├── logout.php
│   ├── painel.php         ← Painel produção
│   ├── estudio.php        ← Modo estúdio broadcast
│   ├── camera.php         ← Câmera do convidado
│   ├── camera-view.php    ← Saída para vMix
│   ├── assets/css/
│   ├── assets/js/
│   └── api/               ← Cópia dos endpoints (acesso web)
│
├── schema-production.sql  ← Schema + usuário admin (único arquivo SQL)
├── INSTALACAO.md          ← Guia de deploy
├── AUDITORIA-NODE-PHP.md  ← Auditoria sem Node.js
└── SISTEMA.md             ← Este arquivo
```

---

## Páginas do sistema

| Página | Quem acessa | Função |
|--------|-------------|--------|
| `index.php` | Público | Nome + assunto → entra na fila |
| `login.php` | Produção | Autenticação |
| `painel.php` | Produção | Fila, preview, colocar no ar, finalizar, histórico |
| `estudio.php` | Produção | Monitor grande, preview secundário, qualidade sinal |
| `camera.php` | Convidado | Câmera/microfone + envio de vídeo para servidor |
| `camera-view.php` | vMix | Browser Input com vídeo + nome/assunto |
| `logout.php` | Produção | Encerra sessão |

### URLs de exemplo

| Uso | URL |
|-----|-----|
| Site público | `https://topmixcall.topmixtv.com.br/` |
| Login | `https://topmixcall.topmixtv.com.br/login.php` |
| Painel | `https://topmixcall.topmixtv.com.br/painel.php` |
| Modo estúdio | `https://topmixcall.topmixtv.com.br/estudio.php` |
| Câmera convidado | `https://topmixcall.topmixtv.com.br/camera.php?id=123` |
| vMix com overlay | `https://topmixcall.topmixtv.com.br/camera-view.php?id=123` |
| vMix só vídeo | `https://topmixcall.topmixtv.com.br/camera-view.php?id=123&overlay=0` |

---

## Banco de dados

### Tabela `usuarios`

| Campo | Tipo |
|-------|------|
| id | INT PK |
| usuario | VARCHAR(100) UNIQUE |
| senha | VARCHAR(255) — `password_hash()` |
| nome | VARCHAR(255) |
| criado_em | DATETIME |

### Tabela `chamadas`

| Campo | Tipo |
|-------|------|
| id | INT PK |
| nome | VARCHAR(255) |
| assunto | VARCHAR(500) |
| status | ENUM: `aguardando`, `ao_vivo`, `finalizado` |
| criado_em | DATETIME |
| iniciado_em | DATETIME NULL |
| finalizado_em | DATETIME NULL |

### Login padrão (alterar após deploy)

- **Usuário:** `admin`
- **Senha:** `topmix123`

---

## APIs PHP

### Públicas (sem login)

| Endpoint | Método | Função |
|----------|--------|--------|
| `api/entrar-fila.php` | POST | Registra convidado na fila |
| `api/status-chamada.php` | GET | Status de uma chamada por ID |
| `api/camera-feed.php` | GET/POST | Recebe/envia frame JPEG da câmera |

### Autenticadas (sessão produção)

| Endpoint | Método | Função |
|----------|--------|--------|
| `api/login.php` | POST | Login JSON |
| `api/listar-fila.php` | GET | Fila + contadores |
| `api/listar-historico.php` | GET | Entrevistas finalizadas |
| `api/colocar-no-ar.php` | POST | Coloca chamada ao vivo |
| `api/finalizar.php` | POST | Finaliza entrevista |
| `api/limpar-fila.php` | POST | Remove aguardando |
| `api/limpar-historico.php` | POST | Apaga histórico |
| `api/camera-monitor.php` | GET | Status câmera, latência, qualidade |
| `api/camera-link.php` | POST | Marca link enviado ao convidado |

---

## Como a câmera funciona (sem WebRTC)

1. Convidado abre `camera.php?id=X`
2. Navegador solicita permissão (`getUserMedia`)
3. JavaScript captura frames do vídeo local
4. Comprime JPEG (60%, máx. 640px largura)
5. Envia via `fetch` para `api/camera-feed.php`
6. Servidor guarda **apenas 1 frame** em `storage/frames/{id}.jpg`
7. `camera-view.php` e o painel leem esse frame em loop (~3 fps)
8. vMix usa Browser Input apontando para `camera-view.php`

### Indicador de qualidade

| Último frame | Status |
|--------------|--------|
| &lt; 2 segundos | 🟢 Excelente |
| &lt; 5 segundos | 🟡 Média |
| ≥ 5 segundos | 🔴 Fraca |

### Controles mobile (`camera.php`)

- Trocar câmera frontal/traseira
- Ligar/desligar microfone
- Tela cheia
- Reconexão automática se a internet cair

---

## Painel de produção (`painel.php`)

### Abas

1. **Estúdio ao vivo** — monitor, fila, preview do convidado
2. **Histórico** — entrevistas finalizadas

### Ações na fila

| Botão | Ação |
|-------|------|
| Preview | Visualiza convidado antes de ir ao ar |
| Colocar no ar | Muda status para `ao_vivo` |
| Finalizar | Encerra entrevista (com confirmação) |

### Ferramentas do convidado

- **COPIAR LINK DO CONVIDADO** → `camera.php?id=X`
- **COPIAR LINK VMIX** → `camera-view.php?id=X`
- **QR Code** automático para abrir no celular
- Status: Aguardando → Link enviado → Câmera aberta

### Atualização automática

Polling AJAX a cada **3 segundos** (fila, histórico, contadores, câmera).

---

## Modo Estúdio (`estudio.php`)

Interface broadcast com:

- Monitor principal grande (convidado ao vivo)
- Preview secundário
- Monitor de conexão (último frame, latência, qualidade)
- Contador de entrevistas do dia
- Timer ao vivo
- Fila rápida com indicador de qualidade

---

## Integração vMix

1. No painel, selecione o convidado ao vivo ou em preview
2. Clique **COPIAR LINK VMIX**
3. No vMix: **Add Input → Browser**
4. Cole a URL `camera-view.php?id=X`
5. Ative transparência se necessário
6. Use `&overlay=0` para esconder nome/assunto na URL

---

## Segurança

| Medida | Implementação |
|--------|---------------|
| SQL Injection | PDO + prepared statements |
| Senhas | `password_hash()` / `password_verify()` |
| Sessão | `session_regenerate_id()` no login |
| XSS | `htmlspecialchars()` via helper `e()` |
| Storage | `.htaccess` Deny + acesso só via PHP |
| IDs | Validação `filter_var` / `camera_sanitize_id()` |
| Painel | Protegido por `require_login()` |
| APIs produção | `require_api_login()` |

---

## JavaScript (assets/js)

| Arquivo | Página | Função |
|---------|--------|--------|
| `public.js` | index.php | Entrar na fila via fetch |
| `login.js` | login.php | Login via fetch |
| `painel.js` | painel.php | Fila, histórico, preview, vMix, QR |
| `camera.js` | camera.php | Câmera, envio frames, reconexão |
| `camera-view.js` | camera-view.php | Polling vídeo vMix |
| `estudio.js` | estudio.php | Modo estúdio broadcast |

**Nenhum** destes arquivos usa Socket.io, WebRTC ou Node.js.

---

## Requisitos de hospedagem

| Requisito | Obrigatório |
|-----------|-------------|
| PHP 8.0+ | Sim |
| MySQL / MariaDB | Sim |
| Extensão PDO | Sim |
| GD (opcional) | Recomendado — recompressão JPEG |
| HTTPS | Sim — obrigatório para câmera no celular |
| Permissão escrita em `storage/` | Sim |
| Node.js / npm | **Não** |

---

## Instalação rápida (Hostinger)

1. Criar banco MySQL no cPanel
2. Importar `schema-production.sql`
3. Editar `includes/config.php` (DB_HOST, DB_NAME, DB_USER, DB_PASS)
4. Upload:
   - `public/*` → `public_html/`
   - `includes/` → acima de `public_html/`
   - `storage/` → acima de `public_html/` (permissão 755)
5. Acessar o domínio e testar fila + login

Detalhes em `INSTALACAO.md`.

---

## Identidade visual

Tema **broadcast TV**:

- Cores: preto, vermelho, branco
- Marcas: **TOP MIX TV** · **TOP MIX CALL** · **AO VIVO**
- Layout responsivo (desktop e celular)

---

## Diferença da edição Node.js (legada)

| | PHP Edition | Node Edition (legada) |
|--|-------------|----------------------|
| Pasta | `topmixcall-php/` | `iaronaldo/` |
| Servidor | Apache + PHP | Node.js + Express |
| Tempo real | Polling AJAX | Socket.io |
| Vídeo | JPEG frames | WebRTC |
| Deploy | cPanel / Hostinger | VPS / Node App Manager |

**Em produção use apenas `topmixcall-php/`.**

---

## Suporte operacional

### Problemas comuns

| Problema | Solução |
|----------|---------|
| Câmera não abre no celular | Usar HTTPS |
| vMix sem imagem | Convidado deve manter `camera.php` aberto |
| Fila não atualiza | Verificar sessão login no painel |
| Erro banco | Conferir `includes/config.php` |
| Storage cheio | Limpeza automática ativa; verificar permissões |

---

*TOP MIX CALL PHP Edition — Sistema completo de entrevistas ao vivo para TOP MIX TV.*
