{% extends "tesm_core/base.html" %}
{% from "tesm_core/macros.html" import field, checkbox, alert, pill %}

{% block page_title %}Sicherung und Uebertragung{% endblock %}
{% block page_sub %}Verschluesselter Export &middot; zweistufiger Import{% endblock %}

{% block content %}
{% if license_hint %}{{ alert(license_hint, 'warning') }}{% endif %}

{{ alert('Der Export wird mit Argon2id aus Ihrer Passphrase verschluesselt (AES-256-GCM). Ohne
diese Passphrase ist die Datei nicht wiederherstellbar -- es gibt keine Hintertuer. Bewahren Sie
sie getrennt von der Sicherung auf.', 'warning', 'Passphrase') }}

<div class="grid grid--split">
  <section class="card">
    <div class="card__header">
      <div class="flex-1">
        <div class="card__title">{{ icon('download', size=17) }} Sicherung erstellen</div>
        <div class="card__sub">Auswahl je Kategorie &middot; verlangt eine frische Passwortbestaetigung</div>
      </div>
    </div>
    <form method="post" action="{{ url_for('backup.export') }}" data-no-guard>
      <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
      <div class="card__body stack">
        <fieldset class="fieldset">
          <legend>Kategorien</legend>
          <div class="stack stack--tight">
            {% for category in all_categories %}
              {% set allowed = category in categories %}
              <label class="check {{ 'check--disabled' if not allowed }}">
                <input type="checkbox" name="categories" value="{{ category.key }}"
                       {% if allowed and not category.sensitive %}checked{% endif %}
                       {% if not allowed %}disabled{% endif %}>
                <span>
                  {{ category.label }}
                  {% if category.sensitive %}{{ pill('Geheimnisse', 'danger') }}{% endif %}
                  {% if category.admin_only %}{{ pill('nur Admin', 'accent') }}{% endif %}
                  <div class="fs-xs faint">{{ category.hint }}</div>
                  {% if not allowed %}
                    <div class="fs-xs danger-text">Fuer diese Kategorie fehlt Ihnen das Recht.</div>
                  {% endif %}
                </span>
              </label>
            {% endfor %}
          </div>
        </fieldset>

        {% if can_secrets %}
          {{ checkbox('include_secrets', 'Passwoerter der Zugangsdaten mit exportieren',
                      hint_text='Sie liegen dann im Klartext innerhalb der verschluesselten
                      Datei. Ohne dieses Kennzeichen enthaelt die Sicherung nur Namen und
                      Benutzer.') }}
        {% endif %}

        <div class="form-grid">
          {{ field('passphrase', 'Passphrase', type='password', required=True,
                   autocomplete='new-password',
                   hint_text='Mindestens ' ~ min_passphrase ~ ' Zeichen.') }}
          {{ field('passphrase_repeat', 'Passphrase wiederholen', type='password', required=True,
                   autocomplete='new-password') }}
        </div>
      </div>
      <div class="card__footer">
        <button class="btn btn--primary" type="submit" {% if license_hint %}disabled{% endif %}>
          Sicherung herunterladen
        </button>
      </div>
    </form>
  </section>

  <div class="stack">
    {% if preview %}
      <section class="card card--accent">
        <div class="card__header">
          <div class="flex-1">
            <div class="card__title">{{ icon('upload', size=17) }} Geoeffnete Sicherung</div>
            <div class="card__sub">
              Waehlen Sie, was uebernommen werden soll. Gueltig fuer {{ preview_ttl }} Minuten.
            </div>
          </div>
        </div>
        <form method="post" action="{{ url_for('backup.import_apply') }}">
          <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
          <div class="card__body stack">
            <div class="table-wrap">
              <table class="table table--compact">
                <thead><tr><th></th><th>Kategorie</th><th class="numeric">Eintraege</th></tr></thead>
                <tbody>
                  {% for entry in preview.summary %}
                    <tr>
                      <td>
                        <label class="check">
                          <input type="checkbox" name="categories" value="{{ entry.key }}" checked>
                          <span class="sr-only">{{ entry.label }}</span>
                        </label>
                      </td>
                      <td>
                        {{ entry.label }}
                        {% if entry.has_secrets %}{{ pill('mit Passwoertern', 'danger') }}{% endif %}
                      </td>
                      <td class="numeric">{{ entry.count }}</td>
                    </tr>
                  {% endfor %}
                </tbody>
              </table>
            </div>
            {{ alert('Bestehende Eintraege werden nach ihrem natuerlichen Schluessel abgeglichen
            (Name, Hostname, MAC, Benutzername) und aktualisiert. Eintraege, die im Papierkorb
            liegen, werden nicht wiederbelebt.', 'info') }}
          </div>
          <div class="card__footer modal__footer--split">
            <button class="btn btn--sm btn--ghost" type="submit"
                    formaction="{{ url_for('backup.import_discard') }}">Verwerfen</button>
            <button class="btn btn--primary" type="submit"
                    data-confirm="Ausgewaehlte Kategorien jetzt uebernehmen? Bestehende Daten werden aktualisiert."
                    data-confirm-title="Sicherung uebernehmen" data-confirm-ok="Uebernehmen"
                    data-confirm-style="primary">Uebernehmen</button>
          </div>
        </form>
      </section>
    {% else %}
      <section class="card">
        <div class="card__header">
          <div class="flex-1">
            <div class="card__title">{{ icon('upload', size=17) }} Sicherung einspielen</div>
            <div class="card__sub">Erst oeffnen und pruefen, dann uebernehmen</div>
          </div>
        </div>
        <form method="post" enctype="multipart/form-data" data-no-guard
              action="{{ url_for('backup.import_preview') }}">
          <input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
          <div class="card__body stack">
            <input class="input" type="file" name="backup_file" accept=".json" required>
            {{ field('passphrase', 'Passphrase der Datei', type='password', required=True,
                     autocomplete='off') }}
          </div>
          <div class="card__footer">
            <button class="btn btn--primary" type="submit" data-busy-label="Oeffne ...">
              Datei oeffnen
            </button>
          </div>
        </form>
      </section>
    {% endif %}

    <section class="card">
      <div class="card__header">
        <div class="flex-1"><div class="card__title">{{ icon('info', size=17) }} Was gesichert wird</div></div>
      </div>
      <div class="card__body">
        <ul class="stack stack--tight fs-sm muted">
          <li>Verzeichniskonten werden nie exportiert -- sie entstehen am Ziel bei der ersten Anmeldung neu.</li>
          <li>Lizenz- und Aktivierungszustand bleiben ausgenommen: sie gehoeren zur Maschine, nicht zur Sicherung.</li>
          <li>Sitzungen, Ratenbegrenzung und das Aenderungsprotokoll sind nicht Teil der Sicherung.</li>
          <li>Der Zwischenstand des Imports liegt in der Datenbank -- ein Dienst-Neustall verliert ihn nicht.</li>
        </ul>
      </div>
    </section>
  </div>
</div>
{% endblock %}
