import uuid

from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import current_user, login_required

from web_application import bcrypt, db
from web_application.admin.main.forms import UserCreateForm, UserEditForm
from web_application.constants import roles
from web_application.models import User

admin = Blueprint(
    "admin",
    __name__,
    template_folder="templates",
    static_folder="static",
    url_prefix="/admin",
)


@admin.route("/")
@admin.route("/home")
@login_required
def home():
    return redirect(url_for("main.home"))
    # return render_template("main/admin_home.html")


@admin.route("/create-user", methods=["GET", "POST"])
@login_required
def create_user():
    if current_user.role != roles["Admin"]["id"]:
        flash("Bu sayfaya erişim izniniz yok.", "danger")
        return redirect(url_for("main.home"))

    form = UserCreateForm()
    if request.method == "POST":
        if form.validate_on_submit():
            user = User.query.filter_by(email=form.email.data).first()
            if user:
                flash("Bu e-posta adresi zaten kayıtlı.", "danger")
            else:
                hashed_password = bcrypt.generate_password_hash(form.password.data)
                new_user = User(
                    uuid=str(uuid.uuid4()),
                    full_name=form.full_name.data,
                    username=form.username.data,  # Model handles generation if empty/None
                    email=form.email.data,
                    phone=form.phone.data,
                    password=hashed_password,
                    role=form.role.data,
                    status=form.status.data,
                )
                db.session.add(new_user)
                try:
                    db.session.commit()
                    flash("Kullanıcı başarıyla oluşturuldu.", "success")
                    return redirect(url_for("admin.create_user"))
                except Exception as e:
                    db.session.rollback()
                    flash(f"Kullanıcı oluşturulurken bir hata oluştu: {e}", "danger")

    return render_template(
        "main/create_user.html", form=form, title="Yeni Kullanıcı Oluştur"
    )


@admin.route("/users-list", methods=["GET"])
@login_required
def users_list():
    if current_user.role != roles["Admin"]["id"]:
        flash("Bu sayfaya erişim izniniz yok.", "danger")
        return redirect(url_for("main.home"))

    page = request.args.get("page", 1, type=int)
    users = User.query.paginate(page=page, per_page=10)

    return render_template(
        "main/users_list.html", users=users, title="Kullanıcı Listesi"
    )


@admin.route("/edit-user/<int:user_id>", methods=["GET", "POST"])
@login_required
def edit_user(user_id):
    if current_user.role != roles["Admin"]["id"]:
        flash("Bu sayfaya erişim izniniz yok.", "danger")
        return redirect(url_for("main.home"))

    user = User.query.get_or_404(user_id)
    form = UserEditForm()

    if request.method == "POST":
        if form.validate_on_submit():
            # Check if email is already taken by another user
            existing_user = User.query.filter_by(email=form.email.data).first()
            if existing_user and existing_user.id != user.id:
                flash("Bu e-posta adresi zaten kayıtlı.", "danger")
            else:
                user.full_name = form.full_name.data
                user.email = form.email.data
                user.phone = form.phone.data
                user.role = form.role.data
                user.status = form.status.data

                try:
                    db.session.commit()
                    flash("Kullanıcı başarıyla güncellendi.", "success")
                    return redirect(url_for("admin.users_list"))
                except Exception as e:
                    db.session.rollback()
                    flash(f"Kullanıcı güncellenirken bir hata oluştu: {e}", "danger")
    elif request.method == "GET":
        form.full_name.data = user.full_name
        form.email.data = user.email
        form.phone.data = user.phone
        form.role.data = user.role
        form.status.data = user.status

    return render_template(
        "main/edit_user.html", form=form, user=user, title="Kullanıcı Düzenle"
    )


@admin.route("/delete-user/<int:user_id>", methods=["POST"])
@login_required
def delete_user(user_id):
    if current_user.role != roles["Admin"]["id"]:
        flash("Bu sayfaya erişim izniniz yok.", "danger")
        return redirect(url_for("main.home"))

    user = User.query.get_or_404(user_id)

    # Prevent deletion of the current user
    if user.id == current_user.id:
        flash("Kendi hesabınızı silemezsiniz.", "danger")
        return redirect(url_for("admin.users_list"))

    try:
        db.session.delete(user)
        db.session.commit()
        flash("Kullanıcı başarıyla silindi.", "success")
    except Exception as e:
        db.session.rollback()
        flash(f"Kullanıcı silinirken bir hata oluştu: {e}", "danger")

    return redirect(url_for("admin.users_list"))
