from datetime import datetime, date
from flask import Blueprint, render_template, request, jsonify
from flask_login import login_required, current_user

from extensions import db
from models import Employee, Role, BirthdayEmailLog
from utils.birthday_reminders import send_birthday_reminders

birthday_tools_bp = Blueprint("birthday_tools", __name__, url_prefix="/admin/birthday-reminders")


def _is_hr_or_admin() -> bool:
    """
    Adjust this check to match your role system.
    - If your Employee has role relationship: current_user.role.name
    - If role is a string: current_user.role
    """
    try:
        r = getattr(getattr(current_user, "role", None), "name", None)
        if r and r.lower() in ("hr", "admin", "superadmin"):
            return True
    except Exception:
        pass

    # fallback (department contains HR)
    try:
        dept = getattr(getattr(current_user, "department", None), "name", "") or ""
        if "hr" in dept.lower():
            return True
    except Exception:
        pass

    return False


@birthday_tools_bp.route("/", methods=["GET"])
@login_required
def dashboard():
    if not _is_hr_or_admin():
        return render_template("errors/403.html"), 403

    # Filters
    q = (request.args.get("q") or "").strip()
    year = request.args.get("year", type=int)
    emp_id = request.args.get("employee_id", type=int)
    date_from = request.args.get("date_from")  # YYYY-MM-DD (target_date)
    date_to = request.args.get("date_to")      # YYYY-MM-DD (target_date)

    page = request.args.get("page", default=1, type=int)
    per_page = request.args.get("per_page", default=20, type=int)

    qb = (BirthdayEmailLog.query
          .order_by(BirthdayEmailLog.sent_at.desc()))

    if year:
        qb = qb.filter(BirthdayEmailLog.year == year)

    if emp_id:
        qb = qb.filter(BirthdayEmailLog.employee_id == emp_id)

    if date_from:
        try:
            d1 = datetime.strptime(date_from, "%Y-%m-%d").date()
            qb = qb.filter(BirthdayEmailLog.target_date >= d1)
        except Exception:
            pass

    if date_to:
        try:
            d2 = datetime.strptime(date_to, "%Y-%m-%d").date()
            qb = qb.filter(BirthdayEmailLog.target_date <= d2)
        except Exception:
            pass

    if q:
        # search by subject or recipients
        qb = qb.filter(
            db.or_(
                BirthdayEmailLog.subject.ilike(f"%{q}%"),
                BirthdayEmailLog.recipients.ilike(f"%{q}%"),
            )
        )

    pagination = qb.paginate(page=page, per_page=per_page, error_out=False)
    logs = pagination.items

    employees = Employee.query.order_by(Employee.full_name).all()

    # For quick “last run” view
    latest = BirthdayEmailLog.query.order_by(BirthdayEmailLog.sent_at.desc()).first()

    return render_template(
        "admin/birthday_reminders.html",
        logs=logs,
        pagination=pagination,
        employees=employees,
        latest=latest,
        # echo filters
        q=q, year=year, emp_id=emp_id, date_from=date_from, date_to=date_to, per_page=per_page
    )


@birthday_tools_bp.route("/run", methods=["POST"])
@login_required
def run_now():
    if not _is_hr_or_admin():
        return jsonify({"ok": False, "error": "Forbidden"}), 403

    # lead_days default 2; allow override from UI
    lead_days = request.form.get("lead_days", "2")
    try:
        lead_days = int(lead_days)
    except Exception:
        lead_days = 2

    try:
        sent, skipped = send_birthday_reminders(lead_days=lead_days, tz_name="Asia/Kolkata")
        return jsonify({"ok": True, "sent": sent, "skipped": skipped})
    except Exception as e:
        db.session.rollback()
        return jsonify({"ok": False, "error": str(e)}), 500