"""
Key management blueprint — unified view of all key material.
"""

from auth import get_username, login_required
from flask import Blueprint, flash, redirect, render_template, url_for

from soosef.audit import log_action

bp = Blueprint("keys", __name__, url_prefix="/keys")


@bp.route("/")
@login_required
def index():
    """Key management dashboard."""
    from soosef.keystore import KeystoreManager

    ks = KeystoreManager()
    return render_template("fieldkit/keys.html", keystore=ks.status())


@bp.route("/channel/generate", methods=["POST"])
@login_required
def generate_channel():
    """Generate a new channel key."""
    from soosef.keystore import KeystoreManager

    ks = KeystoreManager()
    try:
        key = ks.generate_channel_key()
        log_action(
            actor=get_username(),
            action="key.channel.generate",
            target=f"channel:{key[:8]}",
            outcome="success",
            source="web",
        )
        flash(f"Channel key generated: {key[:8]}...", "success")
    except Exception as exc:
        log_action(
            actor=get_username(),
            action="key.channel.generate",
            target="channel",
            outcome="failure",
            source="web",
            detail=str(exc),
        )
        flash(f"Channel key generation failed: {exc}", "error")
    return redirect(url_for("keys.index"))


@bp.route("/identity/generate", methods=["POST"])
@login_required
def generate_identity():
    """Generate a new Ed25519 identity."""
    from soosef.keystore import KeystoreManager

    ks = KeystoreManager()
    try:
        info = ks.generate_identity()
        log_action(
            actor=get_username(),
            action="key.identity.generate",
            target=f"identity:{info.fingerprint[:16]}",
            outcome="success",
            source="web",
        )
        flash(f"Identity generated: {info.fingerprint[:16]}...", "success")
    except Exception as exc:
        log_action(
            actor=get_username(),
            action="key.identity.generate",
            target="identity",
            outcome="failure",
            source="web",
            detail=str(exc),
        )
        flash(f"Identity generation failed: {exc}", "error")
    return redirect(url_for("keys.index"))
