# Fichier: blueprints/main.py (VERSION FINALE PROPRE)
import os
from flask import Blueprint, render_template, url_for, redirect, current_app, flash, request, send_from_directory
from flask_login import login_required, current_user
from models import Rapport
from extensions import db
from sqlalchemy.exc import SQLAlchemyError
from decorators import role_required  # ✅ Important : ne pas oublier l'import

# Définition du Blueprint
main = Blueprint('main', __name__, template_folder='../templates')

# ========================================================================
# PAGE D'ACCUEIL & REDIRECTIONS
# ========================================================================

@main.route('/')
def index():
    """
    Page d'accueil racine.
    Sert de 'Traffic Controller' : redirige selon le rôle.
    """
    # Si non authentifié → Landing Page publique
    if not current_user.is_authenticated:
        return render_template('index.html')

    # Vérification compte actif
    if not current_user.is_active_account:
        flash("Votre compte est désactivé. Contactez un administrateur.", 'danger')
        return redirect(url_for('auth.logout'))
    
    # Redirection selon rôle
    if current_user.role == 'admin':
        return redirect(url_for('admin.supervision'))
    
    if current_user.role == 'manager':
        return redirect(url_for('manager.manager_dashboard'))
    
    # User classique
    return redirect(url_for('main.dashboard'))


@main.route("/dashboard")
@login_required
@role_required(['user', 'manager', 'admin'])
def dashboard():
    try:
        # 1. Configuration
        page = request.args.get('page', 1, type=int)
        search = request.args.get('search', '').strip()
        per_page = 20
        
        # 2. Requête de base (Rapports de l'utilisateur)
        query = Rapport.query.filter_by(user_id=current_user.id)
        
        # 3. Filtre Recherche
        if search:
            query = query.filter(
                (Rapport.nom_client.ilike(f'%{search}%')) | 
                (Rapport.id.ilike(f'%{search}%'))
            )
        
        # 4. Pagination & Tri
        pagination = query.order_by(Rapport.date_creation.desc()).paginate(
            page=page, per_page=per_page, error_out=False
        )
        
        # 5. Calcul des Stats (Globales)
        all_reports_query = Rapport.query.filter_by(user_id=current_user.id)
        total_rapports = all_reports_query.count()
        
        avg_score = 0
        if total_rapports > 0:
            scores = [r.score_total for r in all_reports_query.with_entities(Rapport.score_total).all()]
            if scores:
                avg_score = round(sum(scores) / len(scores), 1)
                
        dernier_rapport = all_reports_query.order_by(Rapport.date_creation.desc()).first()
        
        stats = {
            'total': total_rapports,
            'score_moyen': avg_score,
            'dernier_rapport': dernier_rapport
        }

        return render_template('dashboard.html', 
                               rapports=pagination.items, 
                               pagination=pagination, 
                               stats=stats,
                               current_search=search)

    except Exception as e:
        current_app.logger.error(f"Erreur dashboard user: {e}", exc_info=True)
        flash("Une erreur est survenue lors du chargement du tableau de bord.", 'danger')
        return render_template('dashboard.html', rapports=[], pagination=None, stats=None, current_search='')

# ========================================================================
# DOCUMENTATION PUBLIQUE
# ========================================================================

@main.route('/documents')
@login_required
def documents():
    """Page publique de consultation des documents"""
    from models import Document
    
    # Récupérer tous les documents
    guides = Document.query.filter_by(category='guide').order_by(Document.created_at.desc()).all()
    cgv = Document.query.filter_by(category='cgv').order_by(Document.created_at.desc()).all()
    others = Document.query.filter_by(category='other').order_by(Document.created_at.desc()).all()
    
    return render_template('documents.html', guides=guides, cgv=cgv, others=others)

@main.route('/documents/download/<string:document_id>')
@login_required
def download_document(document_id):
    """Télécharger un document"""
    from models import Document
    
    document = Document.query.get_or_404(document_id)
    
    upload_path = os.path.join(current_app.root_path, 'static/uploads/documents')
    
    current_app.logger.info(f"📥 {current_user.email} télécharge: {document.title}")
    
    return send_from_directory(
        upload_path, 
        document.filename, 
        as_attachment=True,
        download_name=document.original_filename
    )

# ========================================================================
# PAGES INFORMATIVES
# ========================================================================

@main.route('/about')
def about():
    """Page À propos."""
    return render_template('about.html')

@main.route('/contact')
def contact():
    """Page Contact."""
    return render_template('contact.html')

@main.route('/privacy')
def privacy():
    """Politique de confidentialité."""
    return render_template('privacy.html')

@main.route('/terms')
def terms():
    """Conditions d'utilisation."""
    return render_template('terms.html')

# ========================================================================
# MONITORING & HEALTH CHECK
# ========================================================================

@main.route('/health')
def health_check():
    """
    Health check endpoint pour monitoring.
    """
    try:
        # Vérifier que la DB répond
        db.session.execute(db.text('SELECT 1'))
        return {
            'status': 'ok', 
            'database': 'connected',
            'app': 'running'
        }, 200
    except Exception as e:
        current_app.logger.error(f"Health check failed: {e}", exc_info=True)
        return {
            'status': 'error', 
            'database': 'disconnected',
            'app': 'degraded'
        }, 503

        