from flask import Blueprint, render_template, redirect, url_for, flash, request, g, session
from app.models import db, User, Event, Guest
from app.auth import role_required

admin_bp = Blueprint('admin', __name__, url_prefix='/admin')

@admin_bp.route('/dashboard')
@role_required('admin')
def dashboard():
    # Gather aggregate stats
    total_emcs = User.query.filter_by(role='emc').count()
    total_callers = User.query.filter_by(role='caller').count()
    total_events = Event.query.count()
    total_guests = Guest.query.count()
    
    # RSVP breakdowns
    rsvp_attending = Guest.query.filter_by(rsvp_status='attending').count()
    rsvp_pending = Guest.query.filter_by(rsvp_status='pending').count()
    rsvp_declined = Guest.query.filter_by(rsvp_status='not_attending').count()
    rsvp_tentative = Guest.query.filter_by(rsvp_status='tentative').count()

    # List of Event Management Companies
    emc_list = User.query.filter_by(role='emc').order_by(User.created_at.desc()).all()
    
    # List of all events
    events = Event.query.order_by(Event.date.desc()).all()
    
    return render_template(
        'admin/dashboard.html',
        total_emcs=total_emcs,
        total_callers=total_callers,
        total_events=total_events,
        total_guests=total_guests,
        rsvp_attending=rsvp_attending,
        rsvp_pending=rsvp_pending,
        rsvp_declined=rsvp_declined,
        rsvp_tentative=rsvp_tentative,
        emc_list=emc_list,
        events=events
    )

@admin_bp.route('/emcs')
@role_required('admin')
def emcs():
    """Redirection or alias for EMC management section on dashboard."""
    return redirect(url_for('admin.dashboard', _anchor='emc-section'))

@admin_bp.route('/emc/approve/<int:user_id>', methods=['POST'])
@role_required('admin')
def approve_emc(user_id):
    user = User.query.get_or_404(user_id)
    if user.role != 'emc':
        flash("Invalid operation. User is not an EMC.", "error")
        return redirect(url_for('admin.dashboard'))
        
    user.status = 'approved'
    db.session.commit()
    flash(f"Company '{user.company_name}' has been successfully approved.", "success")
    return redirect(url_for('admin.dashboard'))

@admin_bp.route('/emc/block/<int:user_id>', methods=['POST'])
@role_required('admin')
def block_emc(user_id):
    user = User.query.get_or_404(user_id)
    if user.role != 'emc':
        flash("Invalid operation. User is not an EMC.", "error")
        return redirect(url_for('admin.dashboard'))
        
    user.status = 'blocked'
    db.session.commit()
    flash(f"Company '{user.company_name}' has been blocked.", "warning")
    return redirect(url_for('admin.dashboard'))

@admin_bp.route('/emc/unblock/<int:user_id>', methods=['POST'])
@role_required('admin')
def unblock_emc(user_id):
    user = User.query.get_or_404(user_id)
    if user.role != 'emc':
        flash("Invalid operation. User is not an EMC.", "error")
        return redirect(url_for('admin.dashboard'))
        
    user.status = 'approved'
    db.session.commit()
    flash(f"Company '{user.company_name}' has been reactivated/unblocked.", "success")
    return redirect(url_for('admin.dashboard'))

@admin_bp.route('/event/delete/<int:event_id>', methods=['POST'])
@role_required('admin')
def delete_event(event_id):
    event = Event.query.get_or_404(event_id)
    title = event.title
    db.session.delete(event)
    db.session.commit()
    flash(f"Event '{title}' has been successfully deleted.", "success")
    return redirect(url_for('admin.dashboard'))

@admin_bp.route('/emc/create', methods=['POST'])
@role_required('admin')
def create_emc():
    username = request.form.get('username', '').strip()
    password = request.form.get('password', '')
    company_name = request.form.get('company_name', '').strip()
    
    if not username or not password or not company_name:
        flash("Username, password, and company name are required.", "error")
        return redirect(url_for('admin.dashboard'))
        
    existing = User.query.filter_by(username=username).first()
    if existing:
        flash(f"Username '{username}' is already taken.", "error")
        return redirect(url_for('admin.dashboard'))
        
    new_emc = User(
        username=username,
        role='emc',
        status='approved',  # Automatically approved since Admin created it
        company_name=company_name
    )
    new_emc.set_password(password)
    db.session.add(new_emc)
    db.session.commit()
    
    flash(f"Event Management Company '{company_name}' has been directly provisioned and approved.", "success")
    return redirect(url_for('admin.dashboard'))

@admin_bp.route('/emc/impersonate/<int:user_id>', methods=['POST'])
@role_required('admin')
def impersonate_emc(user_id):
    """Switch the current Admin session to act as the selected EMC."""
    target = User.query.get_or_404(user_id)
    if target.role != 'emc':
        flash("Invalid operation. Target user is not an EMC.", "error")
        return redirect(url_for('admin.dashboard'))
    if target.status != 'approved':
        flash("Cannot impersonate a non-approved EMC account.", "error")
        return redirect(url_for('admin.dashboard'))

    # Save admin identity for later revert
    session['admin_user_id'] = g.user.id
    session['user_id'] = target.id
    flash(f"Now impersonating '{target.company_name}'. Use the top banner to return to Admin.", "success")
    return redirect(url_for('emc.dashboard'))

