# app/public/routes.py

from flask import render_template, request, jsonify, current_app, redirect, url_for, flash, abort
from app.public import public_bp
from app.public.forms import (
    AdvertisementRequestForm,  # ✅ اصلاح نام کلاس
    ContactForm,
    ProjectSearchForm,
    ManagerSearchForm,
    QuickContactForm,
    NewsletterForm,
    UserSearchForm,
    EmployerSearchForm,
    EmployeeSearchForm,
    DateRangeForm,
    ReportFilterForm
)
from app.models import (
    User, Project, ProjectEmployee, Advertisement, 
    AdvertisementRequest, ContactMessage, Notification
)
from app.extensions import db
from werkzeug.utils import secure_filename
from flask_login import login_required, current_user
from datetime import datetime
import os
import uuid
from sqlalchemy import or_, and_


# ============================================
# بخش: ایجاد نوتیفیکیشن‌ها
# ============================================

def send_notification_to_admins(title, message, type='info', link=None, data=None):
    """ارسال نوتیفیکیشن به همه ادمین‌ها"""
    admins = User.query.filter_by(role='admin', is_active=True).all()
    if admins:
        admin_ids = [admin.id for admin in admins]
        Notification.create_for_users(
            user_ids=admin_ids,
            title=title,
            message=message,
            type=type,
            link=link,
            data=data
        )


def send_notification_to_user(user_id, title, message, type='info', link=None, data=None):
    """ارسال نوتیفیکیشن به یک کاربر خاص"""
    Notification.create(
        user_id=user_id,
        title=title,
        message=message,
        type=type,
        link=link,
        data=data
    )


# ============================================
# بخش 1: روت‌های اصلی و عمومی
# ============================================

@public_bp.route('/')
def index():
    """صفحه اصلی سایت"""
    # تبلیغات تایید شده و فعال
    approved_ads = AdvertisementRequest.query.filter(
        AdvertisementRequest.status == 'approved',
        AdvertisementRequest.start_date <= datetime.utcnow(),
        AdvertisementRequest.end_date >= datetime.utcnow()
    ).order_by(AdvertisementRequest.created_at.desc()).all()
    
    # پروژه‌های فعال برای نمایش
    active_projects = Project.query.filter_by(status='active').limit(6).all()
    
    # آمار کلی برای نمایش در صفحه اصلی
    stats = {
        'total_managers': User.query.filter_by(role='manager', is_active=True).count(),
        'total_projects': Project.query.filter_by(status='active').count(),
        'total_employees': User.query.filter_by(role='employee', is_active=True).count(),
        'total_employers': User.query.filter_by(role='employer', is_active=True).count(),
        'total_advertisements': len(approved_ads)
    }
    
    return render_template('public/index.html', 
                         advertisements=approved_ads,
                         projects=active_projects,
                         stats=stats)


@public_bp.route('/about')
def about():
    """درباره ما"""
    return render_template('public/about.html')


@public_bp.route('/faq')
def faq():
    """سوالات متداول"""
    return render_template('public/faq.html')


@public_bp.route('/sitemap')
def sitemap():
    """نقشه سایت"""
    return render_template('public/sitemap.html')


@public_bp.route('/privacy')
def privacy():
    """حریم خصوصی"""
    return render_template('public/privacy.html')


@public_bp.route('/terms')
def terms():
    """قوانین و مقررات"""
    return render_template('public/terms.html')


@public_bp.route('/stats')
def system_stats():
    """آمار کلی سیستم"""
    stats = {
        'total_managers': User.query.filter_by(role='manager', is_active=True).count(),
        'total_employers': User.query.filter_by(role='employer', is_active=True).count(),
        'total_employees': User.query.filter_by(role='employee', is_active=True).count(),
        'total_projects': Project.query.count(),
        'active_projects': Project.query.filter_by(status='active').count(),
        'completed_projects': Project.query.filter_by(status='completed').count(),
        'pending_managers': User.query.filter_by(role='manager', manager_request_status='pending').count(),
        'total_advertisements': AdvertisementRequest.query.filter_by(status='approved').count(),
        'pending_advertisements': AdvertisementRequest.query.filter_by(status='pending').count()
    }
    
    return render_template('public/stats.html', stats=stats)


# ============================================
# بخش 2: روت‌های تماس با ما
# ============================================

@public_bp.route('/contact', methods=['GET', 'POST'])
def contact():
    """صفحه تماس با ما"""
    form = ContactForm()
    
    if form.validate_on_submit():
        try:
            contact = ContactMessage(
                name=form.name.data.strip(),
                email=form.email.data.strip(),
                phone=form.phone.data.strip() if form.phone.data else None,
                subject=form.subject.data.strip() if form.subject.data else None,
                message=form.message.data.strip(),
                is_read=False,
                is_replied=False
            )
            
            db.session.add(contact)
            db.session.commit()
            
            # ارسال نوتیفیکیشن به ادمین‌ها
            send_notification_to_admins(
                title='پیام جدید از تماس با ما',
                message=f'پیام جدید از {contact.name} با موضوع {contact.subject or "بدون موضوع"}',
                type='info',
                link=url_for('admin.contact_messages', _external=True),
                data={
                    'entity_type': 'contact',
                    'entity_id': contact.id,
                    'sender_name': contact.name,
                    'sender_email': contact.email
                }
            )
            
            flash('پیام شما با موفقیت ارسال شد. به زودی با شما تماس خواهیم گرفت.', 'success')
            return redirect(url_for('public.contact'))
            
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(f"Error saving contact message: {str(e)}")
            flash('متاسفانه در ارسال پیام خطایی رخ داد. لطفاً مجدداً تلاش کنید.', 'danger')
    
    if form.errors:
        for field, errors in form.errors.items():
            for error in errors:
                flash(f'{getattr(form, field).label.text}: {error}', 'danger')
    
    quick_form = QuickContactForm()
    
    return render_template('public/contact.html', 
                         form=form, 
                         quick_form=quick_form)


@public_bp.route('/contact/quick', methods=['POST'])
def quick_contact():
    """ارسال پیام سریع از فوتر"""
    form = QuickContactForm()
    
    if form.validate_on_submit():
        try:
            contact = ContactMessage(
                name=form.name.data.strip(),
                email=form.email.data.strip(),
                message=form.message.data.strip(),
                subject='پیام از فوتر سایت',
                is_read=False,
                is_replied=False
            )
            
            db.session.add(contact)
            db.session.commit()
            
            flash('پیام شما با موفقیت ارسال شد', 'success')
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(f"Error saving quick contact: {str(e)}")
            flash('خطا در ارسال پیام. لطفاً مجدداً تلاش کنید.', 'danger')
    else:
        for field, errors in form.errors.items():
            for error in errors:
                flash(f'{getattr(form, field).label.text}: {error}', 'danger')
    
    return redirect(url_for('public.contact'))


@public_bp.route('/newsletter/subscribe', methods=['POST'])
def newsletter_subscribe():
    """عضویت در خبرنامه"""
    form = NewsletterForm()
    
    if form.validate_on_submit():
        try:
            contact = ContactMessage(
                name='خبرنامه',
                email=form.email.data.strip(),
                message='عضویت در خبرنامه',
                subject='عضویت در خبرنامه سایت',
                is_read=False,
                is_replied=False
            )
            
            db.session.add(contact)
            db.session.commit()
            
            flash('عضویت شما در خبرنامه با موفقیت انجام شد', 'success')
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(f"Error subscribing to newsletter: {str(e)}")
            flash('خطا در عضویت. لطفاً مجدداً تلاش کنید.', 'danger')
    else:
        for field, errors in form.errors.items():
            for error in errors:
                flash(f'{getattr(form, field).label.text}: {error}', 'danger')
    
    return redirect(request.referrer or url_for('public.index'))


# ============================================
# بخش 3: روت‌های تبلیغات
# ============================================


#======
@public_bp.route('/advertisement-request', methods=['GET', 'POST'])
@login_required
def advertisement_request():
    """صفحه درخواست تبلیغ جدید"""
    
    form = AdvertisementRequestForm()
    
    if form.validate_on_submit():
        try:
            # ✅ ایجاد شیء تبلیغ جدید با user_id
            ad = AdvertisementRequest(
                title=form.title.data,
                description=form.description.data,
                price=form.price.data,
                duration_days=form.duration_days.data,
                user_id=current_user.id,  # ✅ اضافه کردن user_id
                status='pending'
            )
            
            # تنظیم اطلاعات تبلیغ‌دهنده
            ad.advertiser_name = form.advertiser_name.data or current_user.fullname
            ad.advertiser_phone = form.advertiser_phone.data or current_user.phone
            ad.advertiser_email = form.advertiser_email.data or current_user.email
            
            if form.target_url.data:
                ad.target_url = form.target_url.data
            
            #======
             
            # پردازش آپلود تصویر
            if form.image.data:
                image_file = form.image.data
                filename = secure_filename(image_file.filename)
                
                # ایجاد نام منحصر‌به‌فرد برای فایل
                timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
                unique_id = str(uuid.uuid4())[:8]
                new_filename = f"ad_{timestamp}_{unique_id}.{filename.rsplit('.', 1)[1].lower()}"
                
                # مسیر ذخیره‌سازی
                upload_folder = os.path.join(current_app.static_folder, 'uploads', 'advertisements')
                
                # ایجاد پوشه در صورت عدم وجود
                os.makedirs(upload_folder, exist_ok=True)
                
                # مسیر کامل فایل
                file_path = os.path.join(upload_folder, new_filename)
                
                # ذخیره فایل
                image_file.save(file_path)
                
                # ذخیره مسیر نسبی در دیتابیس
                ad.image_path = os.path.join('uploads', 'advertisements', new_filename).replace('\\', '/')
            
       
            db.session.add(ad)
            db.session.commit()
            
            flash('درخواست تبلیغ شما با موفقیت ثبت شد.', 'success')
            return redirect(url_for('public.advertisements_list'))
            
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(f"Error creating advertisement: {str(e)}")
            flash(f'خطا در ثبت درخواست: {str(e)}', 'danger')
    
    return render_template('public/advertisement_request.html', form=form)



@public_bp.route('/advertisements')
def advertisements_list():
    """لیست همه تبلیغات فعال"""
    # تبلیغات تایید شده و فعال
    active_ads = AdvertisementRequest.query.filter(
        AdvertisementRequest.status == 'approved',
        AdvertisementRequest.start_date <= datetime.utcnow(),
        AdvertisementRequest.end_date >= datetime.utcnow()
    ).order_by(AdvertisementRequest.created_at.desc()).all()
    
    # تبلیغات در انتظار تایید (فقط برای ادمین)
    pending_ads = []
    if current_user.is_authenticated and current_user.role == 'admin':
        pending_ads = AdvertisementRequest.query.filter_by(
            status='pending'
        ).order_by(AdvertisementRequest.created_at.desc()).all()
    
    return render_template('public/advertisements.html',
                         active_ads=active_ads,
                         pending_ads=pending_ads)
#======================
# app/public/routes.py

@public_bp.route('/advertisement/<int:ad_id>')
def advertisement_detail(ad_id):
    """مشاهده جزئیات یک تبلیغ"""
    ad = AdvertisementRequest.query.get_or_404(ad_id)
    
    # فقط تبلیغات تایید شده قابل مشاهده هستند
    if ad.status != 'approved':
        flash('این تبلیغ قابل مشاهده نیست.', 'warning')
        return redirect(url_for('public.advertisements_list'))
    
    # افزایش بازدید
    ad.increment_view()
    db.session.commit()
    
    return render_template('public/advertisement_detail.html', ad=ad)


@public_bp.route('/advertisement/click/<int:ad_id>')
def advertisement_click(ad_id):
    """ثبت کلیک روی تبلیغ و هدایت به لینک هدف"""
    ad = AdvertisementRequest.query.get_or_404(ad_id)
    
    if ad.status != 'approved':
        flash('این تبلیغ فعال نیست', 'warning')
        return redirect(url_for('public.index'))
    
    # افزایش کلیک
    ad.increment_click()
    db.session.commit()
    
    # هدایت به لینک هدف
    if ad.target_url:
        return redirect(ad.target_url)
    
    # اگر لینک هدف وجود نداشت، به صفحه جزئیات هدایت شود
    return redirect(url_for('public.advertisement_detail', ad_id=ad.id))


@public_bp.route('/advertisement/view/<int:ad_id>')
def advertisement_view(ad_id):
    """ثبت بازدید از تبلیغ"""
    ad = AdvertisementRequest.query.get_or_404(ad_id)
    if ad.status == 'approved':
        ad.views = (ad.views or 0) + 1
        db.session.commit()
    return '', 204



# ============================================
# بخش 4: لیست مدیران با جستجو
# ============================================

@public_bp.route('/managers')
def managers_list():
    """لیست تمام مدیران با قابلیت جستجو و فیلتر"""
    form = ManagerSearchForm()
    
    # دریافت پارامترهای جستجو
    query = request.args.get('query', '').strip()
    status_filter = request.args.get('status', '')
    
    # شروع کوئری - فقط مدیران
    managers_query = User.query.filter_by(role='manager')
    
    # اعمال فیلتر جستجو
    if query:
        managers_query = managers_query.filter(
            or_(
                User.fullname.ilike(f'%{query}%'),
                User.username.ilike(f'%{query}%'),
                User.national_code.ilike(f'%{query}%'),
                User.phone.ilike(f'%{query}%'),
                User.email.ilike(f'%{query}%')
            )
        )
    
    # فیلتر وضعیت مدیر
    if status_filter:
        managers_query = managers_query.filter_by(manager_request_status=status_filter)
    
    # مرتب‌سازی
    managers = managers_query.order_by(User.created_at.desc()).all()
    
    # آمار
    stats = {
        'total': User.query.filter_by(role='manager').count(),
        'active': User.query.filter_by(role='manager', is_active=True).count(),
        'pending': User.query.filter_by(role='manager', manager_request_status='pending').count(),
        'approved': User.query.filter_by(role='manager', manager_request_status='approved').count(),
        'rejected': User.query.filter_by(role='manager', manager_request_status='rejected').count()
    }
    
    return render_template('public/managers.html',
                         managers=managers,
                         form=form,
                         stats=stats,
                         query=query,
                         status_filter=status_filter)


@public_bp.route('/manager/<int:manager_id>')
def manager_detail(manager_id):
    """نمایش اطلاعات کامل یک مدیر و پروژه‌های او"""
    manager = User.query.get_or_404(manager_id)
    
    if manager.role != 'manager':
        flash('کاربر مورد نظر مدیر پروژه نیست', 'warning')
        return redirect(url_for('public.managers_list'))
    
    # پروژه‌های این مدیر
    projects = Project.query.filter_by(manager_id=manager.id).order_by(
        Project.created_at.desc()
    ).all()
    
    # آمار پروژه‌ها
    project_stats = {
        'total': len(projects),
        'active': len([p for p in projects if p.status == 'active']),
        'completed': len([p for p in projects if p.status == 'completed']),
        'suspended': len([p for p in projects if p.status == 'suspended'])
    }
    
    # تعداد کارکنان در پروژه‌های این مدیر
    total_employees = 0
    for project in projects:
        total_employees += ProjectEmployee.query.filter_by(
            project_id=project.id, 
            is_active=True
        ).count()
    
    return render_template('public/manager_detail.html',
                         manager=manager,
                         projects=projects,
                         project_stats=project_stats,
                         total_employees=total_employees)


# ============================================
# بخش 5: لیست کارفرمایان با جستجو
# ============================================

@public_bp.route('/employers')
def employers_list():
    """لیست تمام کارفرمایان با قابلیت جستجو"""
    form = EmployerSearchForm()
    
    # دریافت پارامترهای جستجو
    query = request.args.get('query', '').strip()
    status_filter = request.args.get('status', '')
    
    # شروع کوئری - فقط کارفرمایان
    employers_query = User.query.filter_by(role='employer')
    
    # اعمال فیلتر جستجو
    if query:
        employers_query = employers_query.filter(
            or_(
                User.fullname.ilike(f'%{query}%'),
                User.username.ilike(f'%{query}%'),
                User.national_code.ilike(f'%{query}%'),
                User.phone.ilike(f'%{query}%'),
                User.email.ilike(f'%{query}%')
            )
        )
    
    # فیلتر وضعیت
    if status_filter == 'active':
        employers_query = employers_query.filter_by(is_active=True)
    elif status_filter == 'inactive':
        employers_query = employers_query.filter_by(is_active=False)
    
    # مرتب‌سازی
    employers = employers_query.order_by(User.created_at.desc()).all()
    
    # آمار
    stats = {
        'total': User.query.filter_by(role='employer').count(),
        'active': User.query.filter_by(role='employer', is_active=True).count(),
        'inactive': User.query.filter_by(role='employer', is_active=False).count()
    }
    
    # پروژه‌های هر کارفرما
    for employer in employers:
        employer.project_count = Project.query.filter_by(employer_id=employer.id).count()
    
    return render_template('public/employers.html',
                         employers=employers,
                         form=form,
                         stats=stats,
                         query=query,
                         status_filter=status_filter)


@public_bp.route('/employer/<int:employer_id>')
def employer_detail(employer_id):
    """نمایش اطلاعات کامل یک کارفرما"""
    employer = User.query.get_or_404(employer_id)
    
    if employer.role != 'employer':
        flash('کاربر مورد نظر کارفرما نیست', 'warning')
        return redirect(url_for('public.employers_list'))
    
    # پروژه‌های این کارفرما
    projects = Project.query.filter_by(employer_id=employer.id).order_by(
        Project.created_at.desc()
    ).all()
    
    return render_template('public/employer_detail.html',
                         employer=employer,
                         projects=projects)


# ============================================
# بخش 6: لیست کارکنان با جستجو
# ============================================

@public_bp.route('/employees')
def employees_list():
    """لیست تمام کارکنان با قابلیت جستجو و فیلتر"""
    form = EmployeeSearchForm()
    
    # دریافت پارامترهای جستجو
    query = request.args.get('query', '').strip()
    role_filter = request.args.get('role', '')
    project_filter = request.args.get('project', '')
    
    # شروع کوئری - فقط کارکنان
    employees_query = User.query.filter_by(role='employee')
    
    # اعمال فیلتر جستجو
    if query:
        employees_query = employees_query.filter(
            or_(
                User.fullname.ilike(f'%{query}%'),
                User.username.ilike(f'%{query}%'),
                User.national_code.ilike(f'%{query}%'),
                User.phone.ilike(f'%{query}%')
            )
        )
    
    # فیلتر بر اساس نقش در پروژه (از طریق ProjectEmployee)
    if role_filter:
        employees_query = employees_query.join(
            ProjectEmployee, ProjectEmployee.employee_id == User.id
        ).filter(ProjectEmployee.role_type == role_filter).distinct()
    
    # فیلتر بر اساس پروژه
    if project_filter:
        try:
            project_id = int(project_filter)
            employees_query = employees_query.join(
                ProjectEmployee, ProjectEmployee.employee_id == User.id
            ).filter(ProjectEmployee.project_id == project_id).distinct()
        except ValueError:
            pass
    
    # مرتب‌سازی
    employees = employees_query.order_by(User.created_at.desc()).all()
    
    # آمار
    stats = {
        'total': User.query.filter_by(role='employee').count(),
        'active': User.query.filter_by(role='employee', is_active=True).count()
    }
    
    # دریافت لیست پروژه‌ها برای فیلتر
    projects = Project.query.filter_by(status='active').all()
    
    # دریافت لیست نقش‌ها برای فیلتر
    roles = [
        ('', 'همه نقش‌ها'),
        ('مهندس مجری', 'مهندس مجری'),
        ('مهندس ناظر', 'مهندس ناظر'),
        ('تکنسین', 'تکنسین'),
        ('کارگر ماهر', 'کارگر ماهر'),
        ('کارگر ساده', 'کارگر ساده'),
        ('راننده', 'راننده')
    ]
    
    return render_template('public/employees.html',
                         employees=employees,
                         form=form,
                         stats=stats,
                         projects=projects,
                         roles=roles,
                         query=query,
                         role_filter=role_filter,
                         project_filter=project_filter)


@public_bp.route('/employee/<int:employee_id>')
def employee_detail(employee_id):
    """نمایش اطلاعات کامل یک کارمند"""
    employee = User.query.get_or_404(employee_id)
    
    if employee.role != 'employee':
        flash('کاربر مورد نظر کارمند نیست', 'warning')
        return redirect(url_for('public.employees_list'))
    
    # پروژه‌های این کارمند
    project_employees = ProjectEmployee.query.filter_by(
        employee_id=employee.id,
        is_active=True
    ).all()
    
    projects = []
    for pe in project_employees:
        project = Project.query.get(pe.project_id)
        if project:
            projects.append({
                'project': project,
                'role': pe.role_type,
                'joined_at': pe.joined_at
            })
    
    return render_template('public/employee_detail.html',
                         employee=employee,
                         projects=projects)


# ============================================
# بخش 7: نوتیفیکیشن‌های کاربر
# ============================================

@public_bp.route('/notifications')
@login_required
def notifications():
    """مشاهده تمام نوتیفیکیشن‌های کاربر"""
    notifications = Notification.query.filter_by(
        user_id=current_user.id
    ).order_by(Notification.created_at.desc()).all()
    
    unread_count = Notification.query.filter_by(
        user_id=current_user.id,
        is_read=False
    ).count()
    
    return render_template(
        'public/notifications.html',
        notifications=notifications,
        unread_count=unread_count
    )


@public_bp.route('/notifications/mark-read/<int:notification_id>')
@login_required
def mark_notification_read(notification_id):
    """علامت‌گذاری یک نوتیفیکیشن به عنوان خوانده شده"""
    notification = Notification.query.get_or_404(notification_id)
    
    # بررسی دسترسی
    if notification.user_id != current_user.id:
        flash('شما به این نوتیفیکیشن دسترسی ندارید', 'danger')
        return redirect(url_for('public.notifications'))
    
    notification.is_read = True
    notification.read_at = datetime.utcnow()
    db.session.commit()
    
    flash('نوتیفیکیشن به عنوان خوانده شده علامت‌گذاری شد', 'success')
    return redirect(url_for('public.notifications'))


@public_bp.route('/notifications/mark-all-read')
@login_required
def mark_all_notifications_read():
    """علامت‌گذاری همه نوتیفیکیشن‌ها به عنوان خوانده شده"""
    Notification.query.filter_by(
        user_id=current_user.id,
        is_read=False
    ).update({'is_read': True, 'read_at': datetime.utcnow()})
    db.session.commit()
    
    flash('همه نوتیفیکیشن‌ها به عنوان خوانده شده علامت‌گذاری شدند', 'success')
    return redirect(url_for('public.notifications'))


@public_bp.route('/notifications/delete/<int:notification_id>')
@login_required
def delete_notification(notification_id):
    """حذف یک نوتیفیکیشن"""
    notification = Notification.query.get_or_404(notification_id)
    
    # بررسی دسترسی
    if notification.user_id != current_user.id:
        flash('شما به این نوتیفیکیشن دسترسی ندارید', 'danger')
        return redirect(url_for('public.notifications'))
    
    db.session.delete(notification)
    db.session.commit()
    
    flash('نوتیفیکیشن با موفقیت حذف شد', 'success')
    return redirect(url_for('public.notifications'))


@public_bp.route('/notifications/unread-count')
@login_required
def unread_notifications_count():
    """دریافت تعداد نوتیفیکیشن‌های خوانده نشده (برای AJAX)"""
    count = Notification.query.filter_by(
        user_id=current_user.id,
        is_read=False
    ).count()
    
    return jsonify({'count': count})


# ============================================
# بخش 8: جستجوی عمومی کاربران
# ============================================

@public_bp.route('/users/search')
def search_users():
    """جستجوی عمومی کاربران (برای انتخاب در فرم‌ها)"""
    if not current_user.is_authenticated:
        return jsonify({'error': 'Unauthorized'}), 401
    
    query = request.args.get('q', '').strip()
    role = request.args.get('role', '')
    
    if len(query) < 2:
        return jsonify([])
    
    users_query = User.query.filter(
        or_(
            User.fullname.ilike(f'%{query}%'),
            User.phone.ilike(f'%{query}%'),
            User.username.ilike(f'%{query}%')
        )
    )
    
    if role:
        users_query = users_query.filter_by(role=role)
    
    users = users_query.limit(20).all()
    
    return jsonify([{
        'id': u.id,
        'fullname': u.fullname,
        'phone': u.phone,
        'role': u.role,
        'username': u.username
    } for u in users])


# ============================================
# بخش 9: Error Handlers
# ============================================

@public_bp.app_errorhandler(404)
def page_not_found(e):
    return render_template('errors/404.html'), 404


@public_bp.app_errorhandler(500)
def internal_server_error(e):
    db.session.rollback()
    return render_template('errors/500.html'), 500


# ============================================
# بخش 10: Context Processor
# ============================================

@public_bp.context_processor
def utility_processor():
    from app.public.forms import QuickContactForm, NewsletterForm
    return {
        'quick_contact_form': QuickContactForm(),
        'newsletter_form': NewsletterForm(),
        'current_year': datetime.utcnow().year
    }