"""Private methods for handling errors throughout imputation analysis."""

from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype

# ERROR HANDLING
# --------------

def _not_num_series(m, s):
    """Private method to detect columns of Matrix that are not categorical."""
    if not is_numeric_dtype(s):
        t = s.dtype
        err = f"{m} not appropriate for Series {s.name} of type {t}."
        raise TypeError(err)

def _not_num_matrix(m, mat):
    """Private method to detect columns of Matrix that are not numerical."""
    try:
        for each_col in mat:
            c = mat[each_col]
            _not_num_series(m, c)
    except TypeError as te:
        err = f"{m} not appropriate for Matrix with non-numerical columns."
        raise TypeError(err) from te

def _not_cat_series(m, s):
    """Private method to detect Series that are not categorical."""
    if not is_string_dtype(s):
        t = s.dtype
        err = f"{m} not appropriate for Series {s.name} of type {t}."
        raise TypeError(err)

def _not_cat_matrix(m, mat):
    """Private method to detect columns of Matrix that are not categorical."""
    try:
        for each_col in mat:
            c = mat[each_col]
            _not_cat_series(m, c)
    except TypeError as te:
        err = f"{m} not appropriate for Matrix with non-categorical columns."
        raise TypeError(err) from te