{% extends "base.html" %}
{% block title %}Federação{% endblock %}
{% block heading %}Federação entre provedores{% endblock %}
{% block content %}

{% set fed_ok = modulo_liberado('federacao') %}

{% if not fed_ok %}
<div class="flash flash-error">
  <strong>Módulo em modo demonstração.</strong> A federação entre provedores depende de
  contrato ativo: {{ licenca.motivo }}<br />
  As telas continuam visíveis para consulta, mas publicar listas, cadastrar parceiros e
  sincronizar estão desativados. Fale com {{ dev_name }} ({{ dev_email }}) informando o CNPJ
  <code>{{ licenca.cnpj or 'não informado' }}</code>, e confira
  <a href="{{ url_for('settings.index') }}">Configurações → Licenciamento</a>.
</div>
{% endif %}

<section class="panel">
  <h2>Como a federação funciona</h2>
  <p class="hint">
    A federação replica o modelo do AnaBlock, mas entre instalações do próprio DNS Shield ISP.
    Cada servidor pode atuar em dois papéis, de forma independente:
  </p>
  <ul class="hint">
    <li><strong>Fonte (publicar):</strong> este servidor expõe as listas locais em
      <code>http://{{ cfg.sinkhole_ip }}:8080/api/federacao/listas</code>, protegidas por um token.
      Você envia a URL e o token ao provedor parceiro.</li>
    <li><strong>Consumidor:</strong> este servidor consulta as listas dos parceiros cadastrados
      abaixo e importa os bloqueios que ainda não existem aqui.</li>
  </ul>
  <p class="hint">
    Garantias: bloqueios cadastrados manualmente <strong>nunca</strong> são apagados pela
    federação; domínios em “Domínios liberados / Exceções” continuam com prioridade absoluta
    (passthrough); e cada parceiro tem origem própria, então remover um parceiro remove apenas
    o que veio dele.
  </p>
</section>

<section class="panel narrow">
  <h2>1. Publicar minhas listas (ser fonte)</h2>
  <form method="post" action="{{ url_for('federacao.save_publicacao') }}">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    <label class="check">
      <input type="checkbox" name="publicar" {% if pub.publicar %}checked{% endif %} {% if not fed_ok %}disabled{% endif %} />
      Publicar minhas listas para provedores parceiros
    </label>
    <p class="hint">Ao habilitar sem token existente, um token seguro é gerado automaticamente.</p>

    <label class="check">
      <input type="checkbox" name="publicar_liberacoes" {% if pub.publicar_liberacoes %}checked{% endif %} {% if not fed_ok %}disabled{% endif %} />
      Incluir também as liberações judiciais (passthrough) na publicação
    </label>

    <h3>2. Consumir listas dos parceiros</h3>
    <label class="check">
      <input type="checkbox" name="consumir" {% if pub.consumir %}checked{% endif %} {% if not fed_ok %}disabled{% endif %} />
      Sincronização automática com os parceiros habilitada (via cron)
    </label>
    <label>Frequência de sincronização (minutos, mínimo 15)
      <input type="number" name="frequencia" value="{{ pub.frequencia }}" min="15" max="10080" required {% if not fed_ok %}disabled{% endif %} />
    </label>
    <p class="hint">O cron roda a cada 15 min e respeita este intervalo.</p>

    <label class="check">
      <input type="checkbox" name="remover_ausentes" {% if pub.remover_ausentes %}checked{% endif %} {% if not fed_ok %}disabled{% endif %} />
      Remover da zona os domínios que saírem da lista de um parceiro
    </label>
    <p class="hint">
      Recomendado deixar desmarcado: um parceiro fora do ar por engano não derruba bloqueios
      que você já aplicou.
    </p>

    <button class="btn btn-primary" type="submit" {% if not fed_ok %}disabled{% endif %}>Salvar federação</button>
  </form>

  <h3>Credenciais para entregar ao parceiro</h3>
  <p class="hint">
    URL: <code>http://{{ cfg.sinkhole_ip }}:8080/api/federacao/listas</code><br />
    Token: <code>{{ pub.token_publicacao or 'não gerado' }}</code>
  </p>
  <form method="post" action="{{ url_for('federacao.rotate_token') }}" class="inline-form">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    <button class="btn" type="submit" {% if not fed_ok %}disabled{% endif %}>Gerar novo token</button>
  </form>
  <p class="hint">
    Exponha a porta 8080 apenas para os IPs dos parceiros no seu firewall. Trocar o token
    invalida o acesso de quem ainda usa o antigo.
  </p>
</section>

<section class="panel">
  <div class="panel-head">
    <h2>Provedores parceiros ({{ peers|length }})</h2>
    <div class="actions">
      <form method="post" action="{{ url_for('federacao.sync_now') }}" class="inline-form">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
        <button class="btn btn-primary" type="submit" {% if not fed_ok %}disabled{% endif %}>Sincronizar todos agora</button>
      </form>
    </div>
  </div>

  <p class="hint">
    Última sincronização geral: <strong>{{ pub.ultima_sincronizacao or 'nunca' }}</strong> (UTC) ·
    {{ pub.ultimo_status or 'sem execuções registradas' }}
  </p>

  {% if peers %}
  <table class="table">
    <thead>
      <tr><th>Parceiro</th><th>URL</th><th>Estado</th><th>Última sinc.</th><th>Status</th><th></th></tr>
    </thead>
    <tbody>
      {% for peer in peers %}
      <tr>
        <td>{{ peer.nome }}</td>
        <td class="wrap"><code>{{ peer.url }}</code></td>
        <td>
          <span class="tag">{{ 'habilitado' if peer.enabled else 'pausado' }}</span>
          {% if peer.importar_liberacoes %}<span class="tag">liberações</span>{% endif %}
        </td>
        <td>{{ peer.ultima_sincronizacao or '—' }}</td>
        <td class="wrap">{{ peer.ultimo_status or '—' }}</td>
        <td class="row-actions">
          <form method="post" action="{{ url_for('federacao.sync_now') }}">
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
            <input type="hidden" name="peer_id" value="{{ peer.id }}" />
            <button class="btn btn-ghost" type="submit" {% if not fed_ok %}disabled{% endif %}>Sincronizar</button>
          </form>
          <form method="post" action="{{ url_for('federacao.remove_peer', peer_id=peer.id) }}"
                onsubmit="return confirm('Remover o parceiro {{ peer.nome }} e os domínios recebidos dele?');">
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
            <button class="btn btn-ghost" type="submit">Remover</button>
          </form>
        </td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
  {% else %}
  <p class="empty">Nenhum provedor parceiro cadastrado.</p>
  {% endif %}
</section>

<section class="panel narrow">
  <h2>Cadastrar provedor parceiro</h2>
  <form method="post" action="{{ url_for('federacao.add_peer') }}">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    <label>Nome do provedor
      <input type="text" name="nome" required maxlength="120" placeholder="Ex: Provedor Parceiro LTDA" {% if not fed_ok %}disabled{% endif %} />
    </label>
    <label>URL da API de federação do parceiro
      <input type="url" name="url" required maxlength="300"
             placeholder="http://ip-do-parceiro:8080/api/federacao/listas" {% if not fed_ok %}disabled{% endif %} />
    </label>
    <label>Token fornecido pelo parceiro
      <input type="password" name="token" autocomplete="new-password" {% if not fed_ok %}disabled{% endif %} />
    </label>
    <label class="check">
      <input type="checkbox" name="importar_liberacoes" checked {% if not fed_ok %}disabled{% endif %} />
      Importar também as liberações judiciais publicadas por ele
    </label>
    <label class="check">
      <input type="checkbox" name="enabled" checked {% if not fed_ok %}disabled{% endif %} />
      Incluir na sincronização automática
    </label>
    <button class="btn btn-primary" type="submit" {% if not fed_ok %}disabled{% endif %}>Cadastrar parceiro</button>
  </form>
  <p class="hint">
    Peça ao parceiro a URL e o token exibidos na tela “Federação” da instalação dele.
  </p>
</section>

{% endblock %}
