from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import current_user, login_required
from sqlalchemy import or_, select

from web_application import db
from web_application.admin.urun.forms import UrunFormu
from web_application.helpers.general import kod_olustur
from web_application.models import Urun

ad_urun = Blueprint(
    "ad_urun",
    __name__,
    template_folder="templates",
    static_folder="static",
    url_prefix="/admin/urunler",
)


# @ad_urun.app_errorhandler(404)
# def error_404(error):
#     return render_template("/errors/404.html"), 404


@ad_urun.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_urun.route("/")
@ad_urun.route("/index")
@login_required
def urun_listesi():
    sql = select(Urun).where(Urun.durum != 9).order_by(Urun.olusturma_ts.asc())
    urunler = db.session.execute(sql).scalars().all()

    data = {
        "title": "Ürünler",
        "subtitle": "Fabrika genelindeki aktif ürünler",
        "urunler": urunler,
    }
    return render_template("urun/list.html", **data)


@ad_urun.route("/yeni", methods=["GET", "POST"])
@login_required
def urun_ekle():
    form = UrunFormu()
    if request.method == "POST":
        if form.validate_on_submit():
            mecut_urun = (
                db.session.execute(
                    select(Urun).where(
                        or_(Urun.adi == form.adi.data, Urun.kodu == form.kodu.data)
                    )
                )
                .scalars()
                .first()
            )
            if not mecut_urun:
                yeni_urun = Urun(
                    adi=form.adi.data,
                    kodu=form.kodu.data,
                    aciklama=form.aciklama.data,
                )
                db.session.add(yeni_urun)
                db.session.commit()
                flash("Yeni ürün başarıyla oluşturuldu.", "success")
            else:
                flash(f"{form.adi.data} adlı ürün zaten var.", "danger")
            return redirect(url_for("ad_urun.urun_listesi"))

    data = {
        "title": "Ürün Ekle",
        "subtitle": "Yeni Bir Ürün Oluşturun",
        "form": form,
    }
    return render_template("urun/form.html", **data)


@ad_urun.route("/duzenle/<int:urun_id>", methods=["GET", "POST"])
@login_required
def urun_duzenle(urun_id):
    urun = db.session.execute(select(Urun).where(Urun.id == urun_id)).scalars().first()
    form = UrunFormu(obj=urun)

    if form.validate_on_submit():
        urun.adi = form.adi.data
        urun.kodu = form.kodu.data
        urun.aciklama = form.aciklama.data
        db.session.commit()
        flash("Ürün güncellendi.", "info")
        return redirect(url_for("ad_urun.urun_listesi"))

    return render_template("urun/form.html", form=form, baslik="Ürün Düzenle")


@ad_urun.route("/sil/<int:urun_id>")
@login_required
def urun_sil(urun_id):
    urun = db.session.execute(select(Urun).where(Urun.id == urun_id)).scalars().first()
    urun.durum = 9
    db.session.commit()
    flash("Ürün başarıyla silindi.", "danger")
    return redirect(url_for("ad_urun.urun_listesi"))
