"""Routes: admin prize pool"""
from datetime import datetime
from flask import flash, redirect, render_template, request, url_for

from nexora.core import app
from nexora.database.connection import execute, query
from nexora.utils.helpers import split_upload_list
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/prize-pool", methods=["GET", "POST"])
@admin_required
@permission_required("prize_pool_view")
def admin_prize_pool():
    fields = [
        "prize_pool_title",
        "prize_pool_amount",
        "prize_pool_note",
    ]
    if request.method == "POST":
        if not has_permission("prize_pool_update"):
            return forbidden_response()
        settings = query("SELECT * FROM settings WHERE id = 1", one=True)
        banner_images = []
        for file in request.files.getlist("prize_banner_images"):
            uploaded, upload_error = process_image_upload(file, category="rewards")
            if upload_error:
                flash(upload_error, "danger")
                return redirect(url_for("admin_prize_pool"))
            if uploaded:
                banner_images.append(uploaded)
        if not banner_images:
            legacy_banner, legacy_error = process_image_upload(
                request.files.get("prize_banner_image"), category="rewards"
            )
            if legacy_error:
                flash(legacy_error, "danger")
                return redirect(url_for("admin_prize_pool"))
            if legacy_banner:
                banner_images.append(legacy_banner)

        old_images = split_upload_list(settings["prize_banner_images"] if "prize_banner_images" in settings.keys() else "")
        if settings["prize_banner_image"] and settings["prize_banner_image"] not in old_images:
            old_images.append(settings["prize_banner_image"])
        if banner_images:
            for old_image in old_images:
                delete_upload(old_image)
        assignments = ", ".join(f"{name} = ?" for name in fields)
        values = [request.form.get(name, "").strip() for name in fields]
        if banner_images:
            assignments += ", prize_banner_image = ?, prize_banner_images = ?"
            values.extend([banner_images[0], "\n".join(banner_images)])
        execute(f"UPDATE settings SET {assignments} WHERE id = 1", values)
        flash("Prize pool banner updated.", "success")
        return redirect(url_for("admin_prize_pool"))
    settings = query("SELECT * FROM settings WHERE id = 1", one=True)
    prize_banner_images = split_upload_list(settings["prize_banner_images"] if "prize_banner_images" in settings.keys() else "")
    if settings["prize_banner_image"] and settings["prize_banner_image"] not in prize_banner_images:
        prize_banner_images.insert(0, settings["prize_banner_image"])
    return render_template("admin_prize_pool.html", settings=settings, prize_banner_images=prize_banner_images, prize_items=query("SELECT * FROM prize_items ORDER BY sort_order, id"))


@app.route("/admin/prize-items", methods=["POST"])
@admin_required
@permission_required("prize_items_create")
def add_prize_item():
    image, image_error = process_image_upload(request.files.get("image"), category="rewards")
    if image_error:
        flash(image_error, "danger")
        return redirect(url_for("admin_prize_pool"))
    execute(
        "INSERT INTO prize_items (title, amount, note, image, sort_order, active, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
        (
            request.form.get("title", "").strip(),
            request.form.get("amount", "").strip(),
            request.form.get("note", "").strip(),
            image or "",
            0,
            1 if request.form.get("active") else 0,
            datetime.now().isoformat(timespec="seconds"),
        ),
    )
    flash("Prize item added.", "success")
    return redirect(url_for("admin_prize_pool"))


@app.route("/admin/prize-items/<int:item_id>/edit", methods=["POST"])
@admin_required
@permission_required("prize_items_update")
def edit_prize_item(item_id):
    image, image_error = process_image_upload(request.files.get("image"), category="rewards")
    if image_error:
        flash(image_error, "danger")
        return redirect(url_for("admin_prize_pool"))
    if image:
        old = query("SELECT image FROM prize_items WHERE id = ?", (item_id,), one=True)
        if old and old["image"]:
            delete_upload(old["image"])
        execute("UPDATE prize_items SET title = ?, amount = ?, note = ?, image = ? WHERE id = ?",
                (request.form.get("title", "").strip(), request.form.get("amount", "").strip(),
                 request.form.get("note", "").strip(), image, item_id))
    else:
        execute("UPDATE prize_items SET title = ?, amount = ?, note = ? WHERE id = ?",
                (request.form.get("title", "").strip(), request.form.get("amount", "").strip(),
                 request.form.get("note", "").strip(), item_id))
    flash("Prize item updated.", "success")
    return redirect(url_for("admin_prize_pool"))


@app.route("/admin/prize-items/<int:item_id>/delete", methods=["POST"])
@admin_required
@permission_required("prize_items_delete")
def delete_prize_item(item_id):
    row = query("SELECT image FROM prize_items WHERE id = ?", (item_id,), one=True)
    if row and row["image"]:
        delete_upload(row["image"])
    execute("DELETE FROM prize_items WHERE id = ?", (item_id,))
    flash("Prize item deleted.", "success")
    return redirect(url_for("admin_prize_pool"))


@app.route("/admin/prize-items/<int:item_id>/toggle", methods=["POST"])
@admin_required
@permission_required("prize_items_update")
def toggle_prize_item(item_id):
    execute("UPDATE prize_items SET active = 1 - active WHERE id = ?", (item_id,))
    flash("Prize item visibility updated.", "success")
    return redirect(url_for("admin_prize_pool"))
