from werkzeug.security import generate_password_hash, check_password_hash
from functools import wraps
from flask import flash, redirect, url_for
from flask_login import current_user
import secrets
import string

def hash_password(password):
    """هش کردن رمز عبور"""
    return generate_password_hash(password, method='pbkdf2:sha256')

def verify_password(password_hash, password):
    """تأیید رمز عبور"""
    return check_password_hash(password_hash, password)

def generate_project_code():
    """تولید کد 16 رقمی یکتا برای پروژه"""
    return ''.join(secrets.choice(string.digits + string.ascii_uppercase) for _ in range(16))

def generate_check_number():
    """تولید شماره چک الکترونیکی یکتا"""
    return 'CHK' + ''.join(secrets.choice(string.digits) for _ in range(12))

def role_required(*roles):
    """دکوریتور برای کنترل دسترسی بر اساس نقش"""
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                flash('لطفاً ابتدا وارد شوید.', 'warning')
                return redirect(url_for('auth.login'))
            if current_user.role not in roles:
                flash('شما دسترسی به این صفحه را ندارید.', 'danger')
                return redirect(url_for('public.index'))
            return f(*args, **kwargs)
        return decorated_function
    return decorator