# routes/feedback_reports.py
from flask import Blueprint, render_template, request
from flask_login import login_required
from sqlalchemy import func
from extensions import db
from models import FeedbackResponse, FeedbackAnswer, Employee

feedback_reports_bp = Blueprint("feedback", __name__, url_prefix="/feedback")

def _month_or_default():
    # latest month present in responses (or "")
    return (db.session.query(func.coalesce(func.max(FeedbackResponse.month), ""))
            .scalar()) or ""

@feedback_reports_bp.get("/view-submitted-feedback")
@login_required
def view_submitted_feedback():
    month = request.args.get("month", "").strip()
    q = request.args.get("q", "").strip()
    page = request.args.get("page", 1, type=int)
    per_page = request.args.get("per_page", 20, type=int)

    base = (FeedbackResponse.query
            .outerjoin(Employee, FeedbackResponse.employee_id == Employee.id))

    # Month filter (default to latest if none chosen)
    if not month:
        month = _month_or_default()
    if month:
        base = base.filter(FeedbackResponse.month == month)

    # Search: employee fields; also allow "anonymous"/"anon" to include anonymous rows
    if q:
        like = f"%{q}%"
        q_lower = q.lower()
        base = base.filter(
            db.or_(
                Employee.full_name.ilike(like),
                Employee.employee_code.ilike(like),
                Employee.email.ilike(like),
                db.and_(FeedbackResponse.is_anonymous.is_(True),
                        db.literal(q_lower in ("anonymous", "anon")))
            )
        )

    base = base.order_by(FeedbackResponse.submitted_at.desc())

    pagination = base.paginate(page=page, per_page=per_page, error_out=False)

    # months dropdown (newest first)
    months = [m for (m,) in db.session.query(FeedbackResponse.month)
                                   .distinct()
                                   .order_by(FeedbackResponse.month.desc())
                                   .all()]

    # build page numbers server-side (avoid max/min in Jinja)
    if pagination.pages and pagination.pages > 0:
        start = max(1, pagination.page - 2)
        end = min(pagination.pages, pagination.page + 2)
        page_numbers = list(range(start, end + 1))
    else:
        page_numbers = [1]

    return render_template(
        "feedback/view_submitted.html",
        items=pagination.items,
        pagination=pagination,
        months=months,
        current_month=month,
        q=q,
        per_page=per_page,
        page_numbers=page_numbers,
    )

@feedback_reports_bp.get("/response/<int:resp_id>")
@login_required
def response_detail(resp_id):
    resp = (FeedbackResponse.query
            .outerjoin(Employee, FeedbackResponse.employee_id == Employee.id)
            .filter(FeedbackResponse.id == resp_id).first_or_404())

    # Answers already relationship-loaded (resp.answers). We render text,
    # or selected option labels if your model supports them.
    # (Works even if only answer_text exists.)
    return render_template("feedback/response_detail.html", resp=resp)