# .htaccess para o projeto Venlaz
# Este arquivo de configuração do Apache é responsável por definir regras de reescrita de URL, 
# redirecionamentos e outras configurações relacionadas à segurança e organização do projeto
# Ele garante que as URLs sejam amigáveis, melhora a segurança ao desabilitar a listagem de diretórios e 
# redireciona URLs antigas para as novas, mantendo a compatibilidade e a SEO do site     
Options -Indexes

# módulo mod_expires e mod_headers melhora o desempenho do site ao instruir
# os navegadores a armazenarem recursos estáticos (imagens, CSS, JS,
# fontes, etc.) por períodos específicos.
#
# ✔ Reduz o tempo de carregamento para visitantes recorrentes
# ✔ Diminui requisições ao servidor
# ✔ Melhora a pontuação em ferramentas como PageSpeed
#
# O mod_expires define POR QUANTO TEMPO o recurso pode ficar em cache.
# O mod_headers define COMO o navegador deve tratar esse cache.

# O módulo mod_expires define a data de expiração dos arquivos com base
# no tipo de conteúdo (MIME type).
#
# Quando o navegador acessa um recurso, ele recebe um prazo de validade.
# Enquanto esse prazo não expirar, o arquivo será carregado do cache
# local do usuário, sem nova requisição ao servidor.
#
# Estratégia utilizada:
# - Imagens e fontes: 1 ano (raramente mudam; recomenda-se versionar o nome do arquivo)
# - CSS e JS: 1 semana (permite atualizações frequentes com controle)
<IfModule mod_expires.c>
  ExpiresActive On
  # Favicons e imagens: 1 ano (dificilmente mudam; basta versionar o nome)
  ExpiresByType image/x-icon        "access plus 1 year"
  ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
  ExpiresByType image/png           "access plus 1 year"
  ExpiresByType image/jpeg          "access plus 1 year"
  ExpiresByType image/svg+xml       "access plus 1 year"
  ExpiresByType image/webp          "access plus 1 year"
  # CSS e JS: 1 semana (com cache-busting via query string se necessário)
  ExpiresByType text/css            "access plus 1 week"
  ExpiresByType application/javascript "access plus 1 week"
  ExpiresByType text/javascript     "access plus 1 week"
  # Fontes
  ExpiresByType font/woff2          "access plus 1 year"
  ExpiresByType font/woff           "access plus 1 year"
</IfModule>

# O módulo mod_headers define explicitamente o cabeçalho HTTP
# "Cache-Control", que informa ao navegador:
#
# - Se o cache é público ou privado
# - O tempo máximo de armazenamento (max-age)
# - Se precisa revalidar com o servidor (must-revalidate)
# - Se o arquivo nunca mudará (immutable)
#
# Isso complementa o mod_expires e garante maior compatibilidade
# com navegadores modernos e proxies intermediários.       
<IfModule mod_headers.c>
  # Garante que imagens e fontes sejam reusadas do cache sem re-validação
  <FilesMatch "\.(ico|png|jpg|jpeg|svg|webp|woff2|woff)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
  # CSS/JS com revalidação após 1 semana
  <FilesMatch "\.(css|js)$">
    Header set Cache-Control "public, max-age=604800, must-revalidate"
  </FilesMatch>
</IfModule>

# Ativa o mecanismo de reescrita de URLs do Apache, 
#permitindo que as regras definidas neste arquivo sejam aplicadas    
RewriteEngine On

# Define a base para as regras de reescrita
# Se o projeto estiver em um subdiretório, ajuste a base conforme necessário
# Exemplo: se o projeto estiver em /projetos/venlaz/, use: /projetos/venlaz/
RewriteBase /

# ── Redireciona 403 (pasta sem index) para a home ────────────
# Isso evita que usuários vejam a listagem de arquivos quando acessam uma pasta sem um arquivo index.php
# Ajuste o caminho do ErrorDocument conforme a estrutura do seu projeto
# Se o projeto estiver em um subdiretório, certifique-se de que o caminho do ErrorDocument seja relativo à base definida
# Exemplo: se o projeto estiver em /projetos/venlaz/public, use: /projetos/venlaz/public/  
ErrorDocument 403 /public/

# ── Arquivos e diretórios reais passam direto ─────────────────
# Isso garante que arquivos como CSS, JS, imagens e outros recursos sejam servidos normalmente sem passar pelas regras de reescrita
# As condições verificam se o arquivo ou diretório existe, e se sim, a regra de reescrita é ignorada (L)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# ── Rotas públicas de autenticação ───────────────────────────
# Essas rotas são acessíveis sem autenticação e mapeiam URLs amigáveis para os scripts PHP correspondentes
# As regras de reescrita transformam URLs como /login, /register e /logout em seus respectivos arquivos PHP dentro da pasta public
# O flag [L] indica que, se a regra corresponder, nenhuma outra regra será processada para essa requisição
# Se o projeto estiver em um subdiretório, certifique-se de que as URLs amigáveis estejam corretas em relação à base definida
# Exemplo: se o projeto estiver em /projetos/venlaz/, as URLs amigáveis seriam /projetos/venlaz/login, etc.
# As regras de reescrita para as rotas de autenticação são essenciais para manter URLs limpas e amigáveis, melhorando a experiência do usuário e a SEO do site
# As URLs amigáveis também facilitam a memorização e o compartilhamento de links, além de transmitir uma imagem mais profissional do site
RewriteRule ^login$      public/login.php     [L]
RewriteRule ^register$   public/register.php  [L]
RewriteRule ^logout$     public/logout.php    [L]

# ── Proposta pública (token no path) ─────────────────────────
# Esta regra permite acessar uma proposta pública usando um token diretamente na URL, sem a necessidade de parâmetros de consulta
# A URL amigável seria algo como /proposta/abc123, onde "abc123" é o token que identifica a proposta específica
# A regra de reescrita captura o token usando uma expressão regular e o passa como um parâmetro para o script PHP correspondente, 
# que pode então processar a solicitação e exibir a proposta pública com base no token fornecido
# O flag [L,QSA] indica que, se a regra corresponder, nenhuma outra regra será processada para essa requisição, 
# e que quaisquer parâmetros de consulta adicionais na URL original serão preservados
RewriteRule ^proposta/([^/]+)/?$  public/proposta_publica.php?token=$1  [L,QSA]

# ── Módulos internos ─────────────────────────────────────────
# Essas regras mapeiam URLs amigáveis para os scripts PHP correspondentes dentro dos módulos internos do sistema
# Cada módulo tem suas próprias rotas para listagem, criação e edição de recursos, 
# seguindo um padrão consistente para facilitar a navegação e a manutenção do código
# As URLs amigáveis para os módulos internos melhoram a experiência do usuário, tornando as URLs mais intuitivas e 
# fáceis de lembrar, além de contribuir para uma melhor indexação pelos motores de busca
# O flag [L] indica que, se a regra corresponder, nenhuma outra regra será processada para essa requisição, 
# garantindo que a URL seja roteada corretamente para o script PHP correspondente sem interferência de outras regras       
RewriteRule ^dashboard$         app/modules/dashboard/index.php      [L]

RewriteRule ^clientes$          app/modules/clientes/index.php       [L]
RewriteRule ^clientes/novo$     app/modules/clientes/form.php        [L]
RewriteRule ^clientes/editar$   app/modules/clientes/form.php        [L,QSA]

RewriteRule ^produtos$          app/modules/produtos/index.php       [L]
RewriteRule ^produtos/novo$     app/modules/produtos/form.php        [L]
RewriteRule ^produtos/editar$   app/modules/produtos/form.php        [L,QSA]

RewriteRule ^propostas$         app/modules/propostas/index.php      [L]
RewriteRule ^propostas/novo$    app/modules/propostas/form.php       [L]
RewriteRule ^propostas/editar$  app/modules/propostas/form.php       [L,QSA]

RewriteRule ^configuracao$      app/modules/configuracoes/index.php  [L]

# ── Fallback 301: URLs antigas → URLs amigáveis ──────────────
# Essas regras redirecionam URLs antigas para as novas URLs amigáveis usando um redirecionamento permanente (301)
# Isso é importante para manter a compatibilidade com links antigos, melhorar a SEO e 
# garantir que os usuários sejam redirecionados para as novas URLs sem perder o acesso ao conteúdo
# O flag [R=301,L] indica que a resposta será um redirecionamento permanente, e que, 
# se a regra corresponder, nenhuma outra regra será processada para essa requisição
# As URLs antigas são redirecionadas para as novas URLs amigáveis, 
# garantindo que os usuários e os motores de busca sejam direcionados para 
# as páginas corretas sem encontrar erros 404 ou links quebrados      
RewriteRule ^public/login\.php$    /login    [R=301,L]
RewriteRule ^public/register\.php$ /register [R=301,L]
RewriteRule ^public/logout\.php$   /logout   [R=301,L]