"""Routes: admin settings"""
import re
from flask import flash, redirect, render_template, request, url_for

from nexora.config import DEFAULT_HOME_BACKGROUND, DEFAULT_SITE_LOGO
from nexora.core import app
from nexora.database.connection import execute, query
from nexora.services.uploads import delete_upload, process_image_upload
from nexora.security.permissions import (
    admin_required,
    forbidden_response,
    has_permission,
    permission_required,
)


@app.route("/admin/settings", methods=["GET", "POST"])
@admin_required
@permission_required("settings_view")
def admin_settings():
    if request.method == "POST":
        if not has_permission("settings_update"):
            return forbidden_response()
        section = request.form.get("section", "")

        SECTION_FIELDS = {
            "event": [
                "event_title", "event_date", "early_deadline", "early_discount",
                "event_tagline", "event_venue", "event_city", "hero_heading",
                "countdown_mode",
            ],
            "payment": [
                "bank_account", "payment_note", "payment_method_label",
                "payment_bank_name", "payment_account_title", "payment_iban",
                "payment_account_number", "payment_bank_branch",
            ],
            "about": [
                "about_intro", "about_body",
            ],
            "contact": [
                "contact_email", "contact_phone", "contact_address",
                "whatsapp_link", "facebook_link", "instagram_link",
                "youtube_link", "discord_link",
            ],
            "theme": ["nav_bg_color", "nav_text_color", "nav_accent_color"],
        }

        if section in SECTION_FIELDS:
            fields = SECTION_FIELDS[section]
            extra = ""
            values = []
            for name in fields:
                value = request.form.get(name, "").strip()
                if section == "theme" and not re.fullmatch(r"#[0-9a-fA-F]{6}", value):
                    flash("Choose valid six-digit colors for the navigation theme.", "danger")
                    return redirect(url_for("admin_settings"))
                values.append(value)
            if section == "payment":
                values.append(1 if request.form.get("registration_open") else 0)
                extra = ", registration_open = ?"
                settings = query("SELECT * FROM settings WHERE id = 1", one=True)
                qr_image, qr_error = process_image_upload(
                    request.files.get("payment_qr_image"), category="bank_qr"
                )
                if qr_error:
                    flash(qr_error, "danger")
                    return redirect(url_for("admin_settings"))
                if qr_image:
                    if settings and settings["payment_qr_image"]:
                        delete_upload(settings["payment_qr_image"])
                    extra += ", payment_qr_image = ?"
                    values.append(qr_image)
            assignments = ", ".join(f"{name} = ?" for name in fields)
            execute(f"UPDATE settings SET {assignments}{extra} WHERE id = 1", values)
            flash(f"{section.title()} settings saved.", "success")
        elif section == "branding":
            settings = query("SELECT * FROM settings WHERE id = 1", one=True)
            logo, logo_error = process_image_upload(request.files.get("site_logo"), category="logo")
            if logo_error:
                flash(logo_error, "danger")
                return redirect(url_for("admin_settings"))
            home_background, bg_error = process_image_upload(
                request.files.get("home_background"), category="home"
            )
            if bg_error:
                flash(bg_error, "danger")
                return redirect(url_for("admin_settings"))
            assignments, values = [], []
            if logo:
                old_logo = settings["site_logo"] if settings else ""
                # Never delete the canonical default assets
                if old_logo and old_logo != DEFAULT_SITE_LOGO:
                    delete_upload(old_logo)
                assignments.append("site_logo = ?")
                values.append(logo)
            if home_background:
                old_background = settings["home_background"] if settings else ""
                if old_background and old_background != DEFAULT_HOME_BACKGROUND:
                    delete_upload(old_background)
                assignments.append("home_background = ?")
                values.append(home_background)
            if assignments:
                execute(f"UPDATE settings SET {', '.join(assignments)} WHERE id = 1", values)
                flash("Branding images saved.", "success")
            else:
                flash("Choose a logo or homepage background image first.", "warning")
        else:
            flash("Unknown section.", "danger")

        return redirect(url_for("admin_settings"))

    settings = query("SELECT * FROM settings WHERE id = 1", one=True)
    return render_template("admin_settings.html", settings=settings)
