from flask import Blueprint, render_template, request, redirect, url_for
from flask_login import login_required, current_user
from app.models.report import Report
from app.extensions import db
from sqlalchemy import func

dashboard_bp = Blueprint("dashboard", __name__, url_prefix="/dashboard")


@dashboard_bp.route("/")
@login_required
def index():
    # Redirect factory users to their factory dashboard
    if getattr(current_user, 'account_type', None) == 'factory':
        from app.models.services import FactoryPartner
        factory = FactoryPartner.query.filter_by(user_id=current_user.id, is_active=True).first()
        if factory:
            return redirect(url_for("prototyping.factory_dashboard"))

    page = request.args.get("page", 1, type=int)
    per_page = 12
    search = request.args.get("q", "").strip()
    lang_filter = request.args.get("lang", "")
    sort = request.args.get("sort", "newest")

    query = Report.query.filter_by(user_id=current_user.id)

    if search:
        query = query.filter(
            (Report.project_name.ilike(f"%{search}%")) |
            (Report.project_description.ilike(f"%{search}%"))
        )
    if lang_filter:
        query = query.filter_by(language=lang_filter)

    if sort == "oldest":
        query = query.order_by(Report.created_at.asc())
    elif sort == "name":
        query = query.order_by(Report.project_name.asc())
    else:
        query = query.order_by(Report.created_at.desc())

    pagination = query.paginate(page=page, per_page=per_page, error_out=False)
    reports = pagination.items

    total_reports = Report.query.filter_by(user_id=current_user.id).count()
    plan = current_user.active_plan

    all_reports = Report.query.filter_by(user_id=current_user.id).all()
    go_count = sum(1 for r in all_reports if r.verdict == "GO")
    nogo_count = sum(1 for r in all_reports if r.verdict == "NO-GO")
    caution_count = sum(1 for r in all_reports if r.verdict and r.verdict not in ("GO", "NO-GO"))
    avg_score = 0
    scored = [r for r in all_reports if r.viability_score]
    if scored:
        avg_score = round(sum(r.viability_score for r in scored) / len(scored))

    from app.models.features import InvestorContact, Notification
    investors_count = InvestorContact.query.filter_by(user_id=current_user.id).count()
    unread_notifs = Notification.query.filter_by(user_id=current_user.id, is_read=False).count()

    return render_template("dashboard/index.html",
        reports=reports, plan=plan, pagination=pagination,
        total_reports=total_reports, search=search,
        lang_filter=lang_filter, sort=sort,
        go_count=go_count, nogo_count=nogo_count, caution_count=caution_count,
        avg_score=avg_score, investors_count=investors_count, unread_notifs=unread_notifs)
