import pandas as pd
import numpy as np


def clean_dataframe(df: pd.DataFrame) -> pd.DataFrame:
    """Common data cleaning pipeline."""
    # 1. Strip whitespace from string columns
    str_cols = df.select_dtypes(include='object').columns
    df[str_cols] = df[str_cols].apply(lambda c: c.str.strip())

    # 2. Normalize column names
    df.columns = (
        df.columns.str.strip()
        .str.lower()
        .str.replace(r'\s+', '_', regex=True)
        .str.replace(r'[^\w]', '', regex=True)
    )

    # 3. Drop fully empty rows and columns
    df = df.dropna(how='all').dropna(axis=1, how='all')

    # 4. Fill numeric NaN with median
    num_cols = df.select_dtypes(include=np.number).columns
    df[num_cols] = df[num_cols].fillna(df[num_cols].median())

    # 5. Remove duplicate rows
    df = df.drop_duplicates()

    return df.reset_index(drop=True)