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.bolum.forms import BolumForm
from web_application.admin.bolum.forms import BolumForm
from web_application.helpers.general import kod_olustur
from web_application.models import Bolum

ad_bolum = Blueprint(
    "ad_bolum",
    __name__,
    template_folder="templates",
    static_folder="static",
    url_prefix="/admin",
)


# @ad_bolum.app_errorhandler(404)
# def error_404(error):
#     return render_template("/errors/404.html"), 404


@ad_bolum.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_bolum.route("/")
@ad_bolum.route("/index")
@login_required
def bolum_listesi():
    """Tüm bölümleri veritabanından çeker ve listeler."""
    sql = select(Bolum).where(Bolum.durum != 9).order_by(Bolum.olusturma_ts.asc())
    bolumler = db.session.execute(sql).scalars().all()
    data = {
        "title": "Bölümler",
        "subtitle": "Sistemdeki bölümler",
        "bolumler": bolumler,
    }

    return render_template("bolum/list.html", **data)


@ad_bolum.route("/bolumler/<int:id>")
@login_required
def bolum_detay(id):
    """Belirli bir bölümün detaylarını gösterir."""
    bolum = db.session.get(Bolum, id)
    if not bolum:
        from flask import abort
        abort(404)
    return render_template("bolum/detail.html", bolum=bolum)


@ad_bolum.route("/yeni", methods=["GET", "POST"])
@login_required
def bolum_ekle():
    """Yeni bir bölüm oluşturur."""
    form = BolumForm()
    if request.method == "POST":
        if form.validate_on_submit():
            # Form validasyonu başarılıysa nesneyi oluştur
            blm_sql = select(Bolum).where(Bolum.adi == form.adi.data)
            mevcut_bolum = db.session.execute(blm_sql).scalars().first()
            if not mevcut_bolum:
                yeni_bolum = Bolum(adi=form.adi.data, aciklama=form.aciklama.data)

                try:
                    db.session.add(yeni_bolum)
                    db.session.flush()
                    if not yeni_bolum.kodu:
                        yeni_bolum.kodu = f"KB-BLM-{yeni_bolum.id}"

                    db.session.commit()
                    flash("Bölüm başarıyla oluşturuldu.", "success")
                    return redirect(url_for("ad_bolum.bolum_listesi"))
                except Exception as e:
                    db.session.rollback()
                    flash(f"Hata oluştu: {str(e)}", "danger")
            else:
                flash(f"{form.adi.data} adlı bölüm zaten var.", "danger")
    data = {
        "title": "Yeni Bölüm Ekle",
        "subtitle": "Sisteme yeni bir üretim departmanı tanımlayın",
        "form": form,
    }
    return render_template("bolum/form.html", **data)


@ad_bolum.route("/duzenle/<int:bolum_id>", methods=["GET", "POST"])
@login_required
def bolum_duzenle(bolum_id):
    """Mevcut bir bölümü günceller."""
    blm_sql = select(Bolum).where(Bolum.id == bolum_id)
    bolum = db.session.execute(blm_sql).scalars().first()
    # obj=bolum parametresi, formun mevcut verilerle dolu gelmesini sağlar
    form = BolumForm(obj=bolum)

    if form.validate_on_submit():
        # Form verilerini modele aktar
        form.populate_obj(bolum)

        try:
            db.session.commit()
            flash("Bölüm başarıyla güncellendi.", "success")
            return redirect(url_for("ad_bolum.bolum_listesi"))
        except Exception as e:
            db.session.rollback()
            flash(f"Güncelleme hatası: {str(e)}", "danger")

    return render_template("bolum/form.html", form=form, title="Bölümü Düzenle")


@ad_bolum.route("/bolumler/sil/<int:bolum_id>")
@login_required
def bolum_sil(bolum_id):
    """
    Bölümü siler. Güvenlik için sadece POST isteklerini kabul eder.
    HTML tarafında bir form ile tetiklenmelidir.
    """
    blm_sql = select(Bolum).where(Bolum.id == bolum_id)
    bolum = db.session.execute(blm_sql).scalars().first()
    try:
        bolum.durum = 9
        db.session.commit()
        flash("Bölüm silindi.", "info")
    except Exception as e:
        db.session.rollback()
        flash(f"Silme hatası: {str(e)}", "danger")

    return redirect(url_for("ad_bolum.bolum_listesi"))
