from dataclasses import dataclass
from typing import Callable, Iterable

from cml.ports.source_adapters import Adapter
from cml.ports.ml_adapter import MachineLearningModel
from cml.domain.reconstruction import Reconstructor
from cml.domain.data_source import DataSource
from cml.domain.construction import Constructor
from cml.domain.complexity_reduction import FeatureSelector
from cml.domain.deconstruction import Deconstructor
from cml.shared.settings import (
    PreprocessingSettings,
    BlockProcessingSettings,
    DeconstructionSettings,
    ConstructionSettings,
    FeatureSelectionSettings,
    ReconstructionSettings
)


@dataclass
class PreprocessRequest:
    source_adapter: Adapter
    pre_settings: PreprocessingSettings
    block_settings: BlockProcessingSettings
    density_estimator: MachineLearningModel
    relative_extrema: Callable


@dataclass
class KnowledgeSearchRequest:
    constructor: Constructor
    feature_selector: FeatureSelector
    reconstructor: Reconstructor
    deconstructor: Deconstructor
    data_source: DataSource
    stdout: bool


@dataclass
class DeconstructionRequest:
    settings: DeconstructionSettings
    knowledge_type: str


@dataclass
class CreateConstructorRequest:
    settings: ConstructionSettings
    ml_models: Iterable


@dataclass
class FeatureSelectionRequest:
    filter_method: MachineLearningModel
    embedded_method: MachineLearningModel
    settings: FeatureSelectionSettings


@dataclass
class ReconstructionRequest:
    settings: ReconstructionSettings
    ml_models: Iterable
    knowledge_domain: str