import numpy as np
import pytest

from statsmodels.graphics.boxplots import violinplot, beanplot
from statsmodels.datasets import anes96

try:
    import matplotlib.pyplot as plt
except ImportError:
    pass


@pytest.fixture(scope="module")
def age_and_labels():
    # Test violinplot and beanplot with the same dataset.
    data = anes96.load_pandas()
    party_ID = np.arange(7)
    labels = ["Strong Democrat", "Weak Democrat", "Independent-Democrat",
              "Independent-Independent", "Independent-Republican",
              "Weak Republican", "Strong Republican"]
    age = [data.exog['age'][data.endog == id] for id in party_ID]
    age = np.array(age, dtype="object")
    return age, labels


# TODO: Remove once SciPy 1.5.0 is the minimum
IGNORE_VISIBLE_DEPR = """\
ignore:Creating an ndarray from ragged nested sequences:\
numpy.VisibleDeprecationWarning:"""


@pytest.mark.filterwarnings(IGNORE_VISIBLE_DEPR)
@pytest.mark.matplotlib
def test_violinplot(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    violinplot(age, ax=ax, labels=labels,
               plot_opts={'cutoff_val': 5, 'cutoff_type': 'abs',
                          'label_fontsize': 'small',
                          'label_rotation': 30})


@pytest.mark.filterwarnings(IGNORE_VISIBLE_DEPR)
@pytest.mark.matplotlib
def test_violinplot_bw_factor(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    violinplot(age, ax=ax, labels=labels,
               plot_opts={'cutoff_val': 5, 'cutoff_type': 'abs',
                          'label_fontsize': 'small',
                          'label_rotation': 30,
                          'bw_factor': .2})


@pytest.mark.matplotlib
def test_beanplot(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    beanplot(age, ax=ax, labels=labels,
             plot_opts={'cutoff_val': 5, 'cutoff_type': 'abs',
                        'label_fontsize': 'small',
                        'label_rotation': 30})


@pytest.mark.matplotlib
def test_beanplot_jitter(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    beanplot(age, ax=ax, labels=labels, jitter=True,
             plot_opts={'cutoff_val': 5, 'cutoff_type': 'abs',
                        'label_fontsize': 'small',
                        'label_rotation': 30})


@pytest.mark.matplotlib
def test_beanplot_side_right(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    beanplot(age, ax=ax, labels=labels, jitter=True, side='right',
             plot_opts={'cutoff_val': 5, 'cutoff_type': 'abs',
                        'label_fontsize': 'small',
                        'label_rotation': 30})


@pytest.mark.matplotlib
def test_beanplot_side_left(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    beanplot(age, ax=ax, labels=labels, jitter=True, side='left',
             plot_opts={'cutoff_val': 5, 'cutoff_type': 'abs',
                        'label_fontsize': 'small',
                        'label_rotation': 30})


@pytest.mark.matplotlib
def test_beanplot_legend_text(age_and_labels, close_figures):
    age, labels = age_and_labels

    fig, ax = plt.subplots(1, 1)
    beanplot(age, ax=ax, labels=labels,
             plot_opts={'bean_legend_text': 'text'})
