import uuid
from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify
from flask_login import login_required, current_user
from app.extensions import db
from app.models.features import Workspace, WorkspaceMember
from app.models.user import User

workspaces_bp = Blueprint("workspaces", __name__, url_prefix="/workspaces")


@workspaces_bp.route("/")
@login_required
def index():
    owned = Workspace.query.filter_by(owner_id=current_user.id).all()
    memberships = WorkspaceMember.query.filter_by(user_id=current_user.id).all()
    joined = [m.workspace for m in memberships if m.workspace.owner_id != current_user.id]
    return render_template("workspaces/index.html", owned=owned, joined=joined)


@workspaces_bp.route("/create", methods=["POST"])
@login_required
def create():
    name = request.form.get("name", "").strip()
    if not name:
        flash("Workspace name is required.", "error")
        return redirect(url_for("workspaces.index"))
    ws = Workspace(name=name, owner_id=current_user.id)
    db.session.add(ws)
    db.session.flush()
    member = WorkspaceMember(workspace_id=ws.id, user_id=current_user.id, role="owner")
    db.session.add(member)
    db.session.commit()
    flash(f"Workspace '{name}' created. Invite code: {ws.invite_code}", "success")
    return redirect(url_for("workspaces.view", ws_id=ws.id))


@workspaces_bp.route("/<int:ws_id>")
@login_required
def view(ws_id):
    ws = Workspace.query.get_or_404(ws_id)
    member = WorkspaceMember.query.filter_by(workspace_id=ws.id, user_id=current_user.id).first()
    if not member:
        flash("Access denied.", "error")
        return redirect(url_for("workspaces.index"))
    from app.models.report import Report
    member_ids = [m.user_id for m in ws.members]
    reports = Report.query.filter(Report.user_id.in_(member_ids)).order_by(Report.created_at.desc()).limit(50).all()
    return render_template("workspaces/view.html", workspace=ws, reports=reports, member=member)


@workspaces_bp.route("/join", methods=["POST"])
@login_required
def join():
    code = request.form.get("code", "").strip()
    ws = Workspace.query.filter_by(invite_code=code).first()
    if not ws:
        flash("Invalid invite code.", "error")
        return redirect(url_for("workspaces.index"))
    existing = WorkspaceMember.query.filter_by(workspace_id=ws.id, user_id=current_user.id).first()
    if existing:
        flash("You are already a member.", "info")
        return redirect(url_for("workspaces.view", ws_id=ws.id))
    member = WorkspaceMember(workspace_id=ws.id, user_id=current_user.id, role="member")
    db.session.add(member)
    db.session.commit()
    flash(f"Joined workspace '{ws.name}'.", "success")
    return redirect(url_for("workspaces.view", ws_id=ws.id))


@workspaces_bp.route("/<int:ws_id>/remove/<int:user_id>", methods=["POST"])
@login_required
def remove_member(ws_id, user_id):
    ws = Workspace.query.get_or_404(ws_id)
    if ws.owner_id != current_user.id:
        flash("Only workspace owner can remove members.", "error")
        return redirect(url_for("workspaces.view", ws_id=ws.id))
    if user_id == current_user.id:
        flash("Cannot remove yourself.", "error")
        return redirect(url_for("workspaces.view", ws_id=ws.id))
    member = WorkspaceMember.query.filter_by(workspace_id=ws.id, user_id=user_id).first()
    if member:
        db.session.delete(member)
        db.session.commit()
        flash("Member removed.", "success")
    return redirect(url_for("workspaces.view", ws_id=ws.id))
