from flask import render_template, Response, flash, redirect, url_for, Blueprint
from flask.typing import ResponseReturnValue
from sqlalchemy import desc

from app.extensions import db
from app.models.mirrors import Proxy
from app.portal.util import LifecycleForm

bp = Blueprint("proxy", __name__)


@bp.route("/list")
def proxy_list() -> ResponseReturnValue:
    proxies = Proxy.query.filter(Proxy.destroyed.is_(None)).order_by(desc(Proxy.added)).all()
    return render_template("list.html.j2",
                           section="proxy",
                           title="Proxies",
                           item="proxy",
                           items=proxies)


@bp.route("/block/<proxy_id>", methods=['GET', 'POST'])
def proxy_block(proxy_id: int) -> ResponseReturnValue:
    proxy = Proxy.query.filter(Proxy.id == proxy_id, Proxy.destroyed.is_(None)).first()
    if proxy is None:
        return Response(render_template("error.html.j2",
                                        header="404 Proxy Not Found",
                                        message="The requested proxy could not be found. It may have already been "
                                                "destroyed."))
    form = LifecycleForm()
    if form.validate_on_submit():
        proxy.deprecate(reason="manual")
        db.session.commit()
        flash("Proxy will be shortly replaced.", "success")
        return redirect(url_for("portal.origin.origin_edit", origin_id=proxy.origin.id))
    return render_template("lifecycle.html.j2",
                           header=f"Mark proxy for {proxy.origin.domain_name} as blocked?",
                           message=proxy.url,
                           section="proxy",
                           form=form)
