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.is_emri.forms import IsEmriFormu
from web_application.helpers.general import kod_olustur
from web_application.models import Bolum, Hat, IsEmri, Urun

ad_is_emri = Blueprint(
    "ad_is_emri",
    __name__,
    template_folder="templates",
    static_folder="static",
    url_prefix="/admin/is-emirleri",
)


# @ad_is_emri.app_errorhandler(404)
# def error_404(error):
#     return render_template("/errors/404.html"), 404


@ad_is_emri.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_is_emri.route("/")
@ad_is_emri.route("/index")
@login_required
def is_emri_listesi():

    sql = select(IsEmri).where(IsEmri.durum != 9).order_by(IsEmri.olusturma_ts.asc())
    is_emirleri = db.session.execute(sql).scalars().all()

    data = {
        "title": "İş Emirleri",
        "subtitle": "Fabrika genelindeki aktif iş emirleri",
        "is_emirleri": is_emirleri,
    }
    return render_template("is_emri/list.html", **data)


@ad_is_emri.route("/yeni", methods=["GET", "POST"])
@login_required
def is_emri_ekle():
    bolumler = db.session.execute(select(Bolum)).scalars().all()
    urunler = db.session.execute(select(Urun)).scalars().all()
    hatlar = db.session.execute(select(Hat)).scalars().all()
    form = IsEmriFormu()
    form.bolum_id.choices = [("", "Bölüm Seçiniz")] + [
        (bolum.id, bolum.adi) for bolum in bolumler
    ]
    
    selected_bolum_id = request.form.get("bolum_id")
    if selected_bolum_id:
        hatlar = db.session.execute(select(Hat).where(Hat.bolum_id == selected_bolum_id)).scalars().all()
        form.hat_id.choices = [(hat.id, hat.adi) for hat in hatlar]
    else:
        form.hat_id.choices = [("", "Önce Bölüm Seçiniz")]
        
    form.urun_id.choices = [(urun.id, urun.adi) for urun in urunler]
    if request.method == "POST":
        if form.validate_on_submit():
            mecut_is_emri = (
                db.session.execute(select(IsEmri).where(IsEmri.adi == form.adi.data))
                .scalars()
                .first()
            )
            if not mecut_is_emri:
                yeni_is = IsEmri(
                    adi=form.adi.data,
                    aciklama=form.aciklama.data,
                    hat_id=form.hat_id.data,
                    urun_id=form.urun_id.data,
                )
                yeni_is.hat.durum = 1
                db.session.add(yeni_is)
            db.session.flush()
            if not yeni_is.kodu:
                yeni_is.kodu = f"{yeni_is.hat.kodu}-{yeni_is.id}"
                db.session.commit()
                flash("Yeni iş emri başarıyla oluşturuldu.", "success")
            else:
                flash(f"{form.adi.data} adlı iş emri zaten var.", "danger")
            return redirect(url_for("ad_is_emri.is_emri_listesi"))

    data = {
        "title": "İş Emri Ekle",
        "subtitle": "Yeni Bir İş Emri Oluşturun",
        "form": form,
    }
    return render_template("is_emri/form.html", **data)


@ad_is_emri.route("/duzenle/<int:is_emri_id>", methods=["GET", "POST"])
@login_required
def is_emri_duzenle(is_emri_id):
    is_emri = (
        db.session.execute(select(IsEmri).where(IsEmri.id == is_emri_id))
        .scalars()
        .first()
    )
    urunler = db.session.execute(select(Urun).where(Urun.durum == 1)).scalars().all()
    bolumler = db.session.execute(select(Bolum).where(Bolum.durum == 1)).scalars().all()
    hatlar = (
        db.session.execute(select(Hat).where(Hat.bolum_id == is_emri.hat.bolum_id))
        .scalars()
        .all()
    )
    form = IsEmriFormu(obj=is_emri)
    form.bolum_id.choices = [(bolum.id, bolum.adi) for bolum in bolumler]
    
    current_bolum_id = request.form.get("bolum_id") or is_emri.hat.bolum_id
    hatlar = (
        db.session.execute(select(Hat).where(Hat.bolum_id == current_bolum_id))
        .scalars()
        .all()
    )
    
    form.bolum_id.data = int(current_bolum_id)
    form.hat_id.choices = [(hat.id, hat.adi) for hat in hatlar]
    form.urun_id.choices = [(urun.id, urun.adi) for urun in urunler]

    if form.validate_on_submit():
        is_emri.adi = form.adi.data
        is_emri.hat_id = form.hat_id.data
        is_emri.urun_id = form.urun_id.data
        is_emri.aciklama = form.aciklama.data
        db.session.commit()
        flash("İş emri güncellendi.", "info")
        return redirect(url_for("ad_is_emri.is_emri_listesi"))

    return render_template("is_emri/form.html", form=form, baslik="İş Emrini Düzenle")


@ad_is_emri.route("/sil/<int:is_emri_id>")
@login_required
def is_emri_sil(is_emri_id):
    is_emri = (
        db.session.execute(select(IsEmri).where(IsEmri.id == is_emri_id))
        .scalars()
        .first()
    )
    is_emri.durum = 9
    db.session.commit()
    flash("İş emri başarıyla silindi.", "danger")
    return redirect(url_for("ad_is_emri.is_emri_listesi"))


@ad_is_emri.route("/durum-degistir/<int:is_emri_id>")
@login_required
def is_emri_durum_degistir(is_emri_id):
    is_emri = (
        db.session.execute(select(IsEmri).where(IsEmri.id == is_emri_id))
        .scalars()
        .first()
    )
    if is_emri.durum == 1:
        is_emri.durum = 2
        is_emri.hat.durum = 2
    elif is_emri.durum == 2:
        is_emri.durum = 1
        is_emri.hat.durum = 1

    db.session.commit()
    flash("İş emri başarıyla silindi.", "danger")
    return redirect(url_for("ad_is_emri.is_emri_listesi"))
