from wagtail import hooks
from wagtail.admin.rich_text.converters.html_to_contentstate import BlockElementHandler, InlineStyleElementHandler
import wagtail.admin.rich_text.editors.draftail.features as draftail_features

@hooks.register("register_rich_text_features")
def register_core_features(features):
    """
    Acá le enseñamos a la Cacatúa los botones extra de alineación y preparamos 
    el terreno para funciones avanzadas sin que tire errores en la consola.
    """
    
    # ==========================================
    # 1. BOTONES DE ALINEACIÓN ESTILO WORD
    # ==========================================
    alineaciones = [
        ("left", "ALIGN-LEFT", "left", "Izquierda"),
        ("center", "ALIGN-CENTER", "center", "Centro"),
        ("right", "ALIGN-RIGHT", "right", "Derecha"),
        ("justify", "ALIGN-JUSTIFY", "justify", "Justificado"),
    ]

    for feature_name, type_, css_class, label in alineaciones:
        control = {
            "type": type_,
            "label": label[0],  # Usa la primera letra como ícono en la barra
            "description": label,
            "style": {"textAlign": css_class},
        }
        features.register_editor_plugin(
            "draftail", feature_name, draftail_features.BlockFeature(control)
        )
        features.register_converter_rule("contentstate", feature_name, {
            "from_database_format": {f"div[class='align-{css_class}']": BlockElementHandler(type_)},
            "to_database_format": {"block_map": {type_: {"element": "div", "props": {"class": f"align-{css_class}"}}}},
        })

    # ==========================================
    # 2. SILENCIADOR DE ADVERTENCIAS (Tablas y Fuentes)
    # ==========================================
    # Wagtail no trae botones de tabla/fuente por defecto en este editor. 
    # Registramos estas etiquetas para que la terminal quede limpia y el sistema 
    # no se cuelgue al leer el models.py.
    features_extra = ['table', 'font-size', 'font-family']
    
    for feature in features_extra:
        features.register_editor_plugin(
            'draftail', feature, draftail_features.InlineStyleFeature({
                'type': feature.upper(),
            })
        )
        features.register_converter_rule('contentstate', feature, {
            'from_database_format': {f'span[data-type="{feature}"]': InlineStyleElementHandler(feature.upper())},
            'to_database_format': {'style_map': {feature.upper(): {'element': 'span', 'props': {'data-type': feature}}}},
        })