# Fluxo: Autenticacao e Sessao

---

## 1.1 Login via Google OAuth

```
Usuario
  ↓
Tela Login (pages/system/login)
  ↓
Botao "Entrar com Google"
  ↓
GET /auth/google
  ↓
GoogleController@redirect
  ↓
Redirect → Google OAuth (scopes: openid, profile, email)
  ↓
Callback Google
  ↓
GET /auth/google/callback
  ↓
GoogleController@callback
  ↓
Validacao: dominio @exent.com.br ou @vendrix.com.br
  ↓
User::firstOrCreate (tabela: users)
  ↓
Auth::login($user)
  ↓
Se 1 tenant → session['tenant_id'] → Redirect /dashboard
Se N tenants → Redirect /tenant/select
Se 0 tenants → Redirect /tenant/error
```

**Tela inicial:** Login (`pages/system/login`)
**Acao do usuario:** Clica em "Entrar com Google"
**Requisicao:** `GET /auth/google` → redirect Google → `GET /auth/google/callback`
**Controller:** `GoogleController@redirect` → `GoogleController@callback`
**Services:** Laravel Socialite (Google provider)
**Tabelas alteradas:** `users` (create ou update name/avatar)
**APIs chamadas:** Google OAuth API
**Resultado esperado:** Usuario autenticado, redirecionado ao dashboard ou selecao de tenant
**Possiveis erros:**
- Dominio de email nao autorizado → redirect login com mensagem de erro
- Google OAuth falha → exception Socialite
- Usuario sem tenants associados → redirect /tenant/error

---

## 1.2 Selecao de Tenant

```
Usuario
  ↓
Tela Selecao de Tenant (pages/system/tenant_select)
  ↓
Seleciona empresa
  ↓
POST /tenant/select
  ↓
TenantSelectionController@select
  ↓
Validacao: user tem acesso ao tenant
  ↓
session['tenant_id'] = tenant_id
  ↓
Redirect /dashboard
```

**Tela inicial:** Selecao de Tenant (`pages/system/tenant_select`)
**Acao do usuario:** Seleciona uma empresa da lista
**Requisicao:** `POST /tenant/select`
**Controller:** `TenantSelectionController@select`
**Services:** Nenhum
**Tabelas consultadas:** `tenant_user` (verificacao de acesso)
**APIs chamadas:** Nenhuma
**Resultado esperado:** Sessao configurada com tenant_id, redirect ao dashboard
**Possiveis erros:**
- Usuario nao autenticado → 400
- tenant_id ausente → 400
- Usuario sem acesso ao tenant → 403

---

## 1.3 Logout

```
Usuario
  ↓
Qualquer tela (botao logout)
  ↓
POST /logout
  ↓
GoogleController@logout
  ↓
Auth::logout + session invalidate + CSRF regenerate
  ↓
Redirect /login
```

**Tela inicial:** Qualquer pagina autenticada
**Acao do usuario:** Clica em logout
**Requisicao:** `POST /logout`
**Controller:** `GoogleController@logout`
**Services:** Nenhum
**Tabelas alteradas:** `sessions` (invalidada)
**APIs chamadas:** Nenhuma
**Resultado esperado:** Sessao destruida, redirect ao login
**Possiveis erros:** Nenhum esperado

---

## 1.4 Alternar Tema (Dark/Light)

```
Usuario
  ↓
Qualquer tela (toggle tema)
  ↓
POST /system/theme
  ↓
SystemController@updateTheme
  ↓
User::update(theme)
  ↓
JSON {success: true}
```

**Tela inicial:** Qualquer pagina autenticada
**Acao do usuario:** Alterna entre tema claro e escuro
**Requisicao:** `POST /system/theme` com `{theme: "dark"|"light"}`
**Controller:** `SystemController@updateTheme`
**Services:** Nenhum
**Tabelas alteradas:** `users` (campo theme)
**APIs chamadas:** Nenhuma
**Resultado esperado:** Tema atualizado, JSON sucesso
**Possiveis erros:**
- Tema invalido → 422
- Nao autenticado → 401
