from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import current_user, login_required
from sqlalchemy import select

from web_application import db
from web_application.admin.hat.forms import HatForm
from web_application.helpers.general import kod_olustur
from web_application.models import Bolum, Hat, IsEmri

ad_hat = Blueprint(
    "ad_hat",
    __name__,
    template_folder="templates",
    static_folder="static",
    url_prefix="/admin/hatlar",
)


# @ad_hat.app_errorhandler(404)
# def error_404(error):
#     return render_template("/errors/404.html"), 404


@ad_hat.before_request
def check_admin_role():
    if not current_user.is_authenticated:
        flash(
            "Sayfayı görüntüleyebilmek için giriş yapın.",
            "danger",
        )
        return redirect(url_for("kullanici.giris"))
    if current_user.seviye not in ["Admin", "Super Admin"]:
        flash(
            "Bu sayfaya giriş yetkiniz bulunmamaktadır. Lütfen giriş yapın ya da yetkiniz dahilinde bir sayfaya gidin.",
            "danger",
        )

        return redirect(url_for("ana.index"))


@ad_hat.route("/")
@ad_hat.route("/index")
@login_required
def hat_listesi():
    hatlar = db.session.execute(select(Hat).where(Hat.durum != 9)).scalars().all()
    data = {
        "title": "Hatlar",
        "subtitle": "Fabrika genelindeki aktif hatlar",
        "hatlar": hatlar,
    }
    return render_template("hat/list.html", **data)


@ad_hat.route("/yeni", methods=["GET", "POST"])
@login_required
def hat_ekle():
    bolumler = db.session.execute(select(Bolum)).scalars().all()
    is_emirleri = db.session.execute(select(IsEmri)).scalars().all()
    form = HatForm(bolumler=bolumler, is_emirleri=is_emirleri)
    if request.method == "POST":
        if form.validate_on_submit():
            yeni_hat = Hat(
                adi=form.adi.data,
                bolum_id=form.bolum_id.data,
                aciklama=form.aciklama.data,
            )
            db.session.add(yeni_hat)
            db.session.flush()
            if not yeni_hat.kodu:
                yeni_hat.kodu = f"{yeni_hat.bolum.kodu}-{yeni_hat.id}"
            db.session.commit()
            flash("Hat başarıyla eklendi.", "success")
            return redirect(url_for("ad_hat.hat_listesi"))
    data = {
        "form": form,
        "title": "Yeni Hat Ekle",
        "subtitle": "Fabrika genelinde yeni bir hat oluşturun",
    }
    return render_template("hat/form.html", **data)


@ad_hat.route("/duzenle/<int:hat_id>", methods=["GET", "POST"])
@login_required
def hat_duzenle(hat_id):
    hat = db.session.get(Hat, hat_id)
    if not hat:
        from flask import abort
        abort(404)
    bolumler = db.session.execute(select(Bolum)).scalars().all()
    form = HatForm(obj=hat, bolumler=bolumler)

    if form.validate_on_submit():
        form.populate_obj(hat)
        db.session.commit()
        flash("Hat güncellendi.", "info")
        return redirect(url_for("ad_hat.hat_listesi"))
    return render_template("hat/form.html", form=form, title="Hattı Düzenle")


@ad_hat.route("/sil/<int:hat_id>")
@login_required
def hat_sil(hat_id):
    hat = db.session.get(Hat, hat_id)
    if not hat:
        from flask import abort
        abort(404)
    try:
        hat.durum = 9
        db.session.commit()
        flash("Hat sistemden kaldırıldı.", "warning")
    except Exception as _:
        db.session.rollback()
        flash("Hata: Hat silinemedi.", "danger")
    return redirect(url_for("ad_hat.hat_listesi"))
