# routes/exit_lists.py
from flask import Blueprint, render_template, request, redirect, url_for, flash
from flask_login import login_required, current_user
from datetime import datetime
from models import db, ExitRequest, HandoverDoc, HandoverDocViewer, Employee

exit_list_bp = Blueprint("exit_list", __name__, url_prefix="/exit")

def role_name():
    obj = getattr(current_user, "role", None)
    if isinstance(obj, str): return obj.lower()
    if obj and hasattr(obj, "name"): return (obj.name or "").lower()
    return ""

def me_emp_id():
    return getattr(current_user, "id", None)  # your User == Employee

# 1) HR list (all exits with filters)
@exit_list_bp.get("/list")
@login_required
def list_all():
    page = max(int(request.args.get("page", 1)), 1)
    per_page = 20
    q = ExitRequest.query
    status = (request.args.get("status") or "").strip()
    search = (request.args.get("q") or "").strip()

    if status:
        q = q.filter(ExitRequest.status == status)
    if search:
        # search employee name or code
        q = q.join(Employee, Employee.id == ExitRequest.employee_id)\
             .filter((Employee.full_name.ilike(f"%{search}%")) | (Employee.employee_code.ilike(f"%{search}%")))

    items = q.order_by(ExitRequest.created_at.desc()).paginate(page=page, per_page=per_page, error_out=False)
    return render_template("exit/list_all.html", items=items, status=status, search=search)

# 2) Manager/HOD approvals queue (things awaiting acceptance or final OK)
# routes/exit_lists.py
from sqlalchemy import or_

@exit_list_bp.get("/approvals")
@login_required
def approvals_queue():
    page = max(int(request.args.get("page", 1)), 1)
    per_page = 20
    my_emp = getattr(current_user, "id", None)

    q = (
        ExitRequest.query
        # see rows where I'm explicitly manager/hod...
        .filter(
            or_(
                ExitRequest.manager_id == my_emp,
                ExitRequest.hod_id == my_emp,
                # ...or I am the current reporting manager of this employee
                ExitRequest.employee_id.in_(
                    db.session.query(Employee.id).filter(Employee.reporting_manager_id == my_emp)
                )
            )
        )
        # needs either initial approval or final OK
        .filter(
            or_(
                ExitRequest.manager_approved_at.is_(None),
                ExitRequest.final_ok_by_manager_at.is_(None),
            )
        )
        .order_by(ExitRequest.created_at.desc())
    )

    items = q.paginate(page=page, per_page=per_page, error_out=False)
    return render_template("exit/approvals_queue.html", items=items)
# 3) IT queue (awaiting IT clearance)
@exit_list_bp.get("/it")
@login_required
def it_queue():
    page = max(int(request.args.get("page", 1)), 1)
    per_page = 20
    q = ExitRequest.query.filter(
        ExitRequest.manager_approved_at.isnot(None),
        ExitRequest.it_cleared_at.is_(None)
    )
    items = q.order_by(ExitRequest.created_at.desc()).paginate(page=page, per_page=per_page, error_out=False)
    return render_template("exit/it_queue.html", items=items)

# 4) My Acks (viewer list) – you already have /exit/my-acks detail; this is a list without doc_id
# routes/exit_lists.py
from types import SimpleNamespace

@exit_list_bp.get("/acks")
@login_required
def acks_queue():
    my_emp = current_user.id
    page = max(int(request.args.get("page", 1)), 1)
    per_page = 20

    q = db.session.query(HandoverDoc, ExitRequest, HandoverDocViewer)\
        .join(ExitRequest, ExitRequest.id == HandoverDoc.exit_id)\
        .join(HandoverDocViewer, HandoverDocViewer.doc_id == HandoverDoc.id)\
        .filter(HandoverDocViewer.viewer_emp_id == my_emp)\
        .order_by(HandoverDoc.uploaded_at.desc())

    total = q.count()
    rows = q.limit(per_page).offset((page - 1) * per_page).all()
    pages = (total + per_page - 1) // per_page

    items = SimpleNamespace(
        items=rows,
        page=page,
        per_page=per_page,
        total=total,
        pages=pages,
        has_prev=page > 1,
        has_next=page < pages,
        prev_num=page - 1,
        next_num=page + 1
    )

    return render_template("exit/acks_queue.html", items=items)
# 5) My exits (employee’s own exit requests)
@exit_list_bp.get("/mine")
@login_required
def my_exits():
    page = max(int(request.args.get("page", 1)), 1)
    per_page = 20
    items = ExitRequest.query.filter_by(employee_id=me_emp_id())\
            .order_by(ExitRequest.created_at.desc())\
            .paginate(page=page, per_page=per_page, error_out=False)
    return render_template("exit/my_exits.html", items=items)