import os
import importlib

from scipy import stats
from installer import log


def test_pipelines():
    from modules.sd_checkpoint import CheckpointInfo

    log.info('Pipelines test...')
    pipelines = os.listdir("pipelines")
    pipelines.sort()
    for filename in pipelines:
        if filename.startswith("model_") and filename.endswith(".py"):
            module_name = filename[:-3]
            module = importlib.import_module("pipelines." + module_name)
            for attr in dir(module):
                if attr.startswith("load_"):
                    load_func = getattr(module, attr)
                    log.debug(f"Test: {module_name}.{attr}()")
                    ckpt = CheckpointInfo(filename = 'none')
                    try:
                        load_func(ckpt)
                    except Exception as e:
                        log.error(f"Error: {module_name}.{attr}(): {e}")

    log.info('Pipelines verify...')
    from modules.shared_items import get_pipelines
    pipelines = get_pipelines()
    stats_diffusers = 0
    stats_transformers = 0
    stats_custom = 0
    stats_deprecated = 0
    stats_fallback = 0
    stats_online = 0
    for name, cls in pipelines.items():
        if name == 'Autodetect' or name == 'AutoPipeline' or name == 'Diffusion' or name.startswith('ONNX'):
            continue
        elif cls is None:
            log.warning(f"Pipeline: {name} not available")
        elif cls.__name__ == 'DiffusionPipeline':
            log.warning(f"Pipeline: {name} using fallback")
        else:
            if 'deprecated.' in str(cls):
                log.warning(f"Pipeline: {name}={cls} deprecated")
                stats_deprecated += 1
            if 'diffusers.pipelines.' in str(cls):
                stats_diffusers += 1
            elif 'pipelines.' in str(cls):
                stats_custom += 1
            elif 'transformers.' in str(cls):
                stats_transformers += 1
            elif 'OnlinePipeline' in str(cls):
                stats_online += 1
            else:
                stats_fallback += 1
                log.warning(f"Pipeline: {name}={cls} not recognized")
    log.info(f"Pipelines test: diffusers={stats_diffusers} transformers={stats_transformers} custom={stats_custom} deprecated={stats_deprecated} online={stats_online} fallback={stats_fallback}")