from flask import flash, current_app


def prepare_table(model_objects, column_names):
    """
    Converts a list of SQLAlchemy model objects into a list of dictionaries based on specified column names.

    Args:
        model_objects (list): List of SQLAlchemy model instances.
        column_names (list): List of strings representing the column names to be included in the dictionaries.

    Returns:
        list: List of dictionaries where each dictionary represents a record with keys as column names.
    """
    table_data = [
        {col: getattr(obj, col) for col in column_names}
        for obj in model_objects
    ]
    return table_data


def prepare_table_for_macro(model_objects, column_attrs):
    """
    Prepare data for rendering in a macro that expects each cell as a dictionary with class, type, and value.

    Args:
        model_objects (list): List of model instances or dictionaries.
        column_attrs (list of tuples): Each tuple contains the attribute name and additional properties like class.

    Returns:
        list: A list of rows, where each row is a list of cell dictionaries.
    """
    return [
        [
            {'value': getattr(obj, attr), 'class': cls, 'type': 'text'}  # Adjust 'type' as needed
            for attr, cls in column_attrs
        ]
        for obj in model_objects
    ]


def form_validation_failed(request, form):
    if request.method == 'POST':
        for fieldName, errorMessages in form.errors.items():
            for err in errorMessages:
                flash(f"Error in {fieldName}: {err}", 'danger')
                current_app.logger.error(f"Error in {fieldName}: {err}")


def form_to_dict(form):
    return {field.name: field.data for field in form if field.name != 'csrf_token' and hasattr(field, 'data')}
