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.musteri.forms import MusteriFormu
from web_application.helpers.general import kod_olustur
from web_application.models import Musteri

ad_musteri = Blueprint(
    "ad_musteri",
    __name__,
    template_folder="templates",
    static_folder="static",
    url_prefix="/admin/musteriler",
)


# @ad_musteri.app_errorhandler(404)
# def error_404(error):
#     return render_template("/errors/404.html"), 404


@ad_musteri.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("musteri.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"))


# --- LİSTELEME ---
@ad_musteri.route("/")
@ad_musteri.route("/index")
@login_required
def musteri_listesi():
    sql = select(Musteri).where(Musteri.durum != 9).order_by(Musteri.olusturma_ts.asc())
    musteriler = db.session.execute(sql).scalars().all()
    data = {
        "title": "Müşteriler",
        "subtitle": "Sistemdeki müşteriler",
        "musteriler": musteriler,
    }
    return render_template("musteri/list.html", **data)


# --- EKLEME (CREATE) ---
@ad_musteri.route("/ekle", methods=["GET", "POST"])
@login_required
def musteri_ekle():
    form = MusteriFormu()
    if request.method == "POST":
        if form.validate_on_submit():
            sql = select(Musteri).where(
                or_(
                    Musteri.eposta == form.eposta.data,
                    Musteri.telefon == form.telefon.data,
                )
            )
            mevcut_musteri = db.session.execute(sql).scalars().first()
            if not mevcut_musteri:
                yeni_musteri = Musteri(
                    ad_soyad=form.ad_soyad.data,
                    kodu=form.kodu.data,
                    eposta=form.eposta.data,
                    telefon=form.telefon.data,
                    aciklama=form.aciklama.data,
                )
                try:
                    db.session.add(yeni_musteri)
                    db.session.flush()
                    if not yeni_musteri.kodu:
                        yeni_musteri.kodu = f"KB-MUST-{yeni_musteri.id}"
                    db.session.commit()
                    flash("Müşteri başarıyla oluşturuldu!", "success")
                    return redirect(url_for("ad_musteri.musteri_listesi"))
                except Exception as e:
                    db.session.rollback()
                    flash(f"Hata oluştu: {str(e)}", "danger")
            else:
                flash("Telefon ya da e-posta zaten kullanılıyor.", "danger")
        else:
            flash(f"{form.ad_soyad.data} adlı müşteri eklenemedi", "danger")
    data = {
        "title": "Müşteri Ekle",
        "subtitle": "Sistem için yeni bir müşteri ekleyin.",
        "form": form,
    }
    return render_template("musteri/form.html", **data)


# --- GÜNCELLEME (UPDATE) ---
@ad_musteri.route("/duzenle/<int:musteri_id>", methods=["GET", "POST"])
@login_required
def musteri_duzenle(musteri_id):
    sql = select(Musteri).where(Musteri.id == musteri_id)
    musteri = db.session.execute(sql).scalars().first()
    form = MusteriFormu(obj=musteri)  # Formu mevcut verilerle doldur

    if form.validate_on_submit():
        musteri.ad_soyad = form.ad_soyad.data
        musteri.kodu = form.kodu.data
        musteri.eposta = form.eposta.data
        musteri.telefon = form.telefon.data
        musteri.aciklama = form.aciklama.data

        try:
            db.session.commit()
            flash("Müşteri güncellendi.", "info")
        except Exception as _:
            db.session.rollback()
            flash("Güncelleme sırasında bir hata oluştu.", "danger")
        return redirect(url_for("ad_musteri.musteri_listesi"))
    data = {
        "title": "Müşteri Düzenle",
        "subtitle": "Sistem için yeni bir müşteri düzenleyin.",
        "form": form,
    }
    return render_template("musteri/form.html", **data)


# --- SİLME (DELETE) ---
@ad_musteri.route("/sil/<int:musteri_id>")
@login_required
def musteri_sil(musteri_id):
    musteri = Musteri.query.get_or_404(musteri_id)

    sql = select(Musteri).where(Musteri.id == musteri_id)
    musteri = db.session.execute(sql).scalars().first()
    try:
        musteri.durum = 9
        db.session.commit()
        flash("Müşteri silindi.", "warning")
    except Exception as _:
        db.session.rollback()
        flash("Silme işlemi başarısız.", "danger")
    return redirect(url_for("ad_musteri.musteri_listesi"))
