# -*- coding: utf-8 -*-
"""The model config."""
from typing import Union, Sequence, Any

from loguru import logger


class _ModelConfig(dict):
    """Base class for model config."""

    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__

    def __init__(
        self,
        config_name: str,
        model_type: str = None,
        **kwargs: Any,
    ):
        """Initialize the config with the given arguments, and checking the
        type of the arguments.

        Args:
            config_name (`str`): A unique name of the model config.
            model_type (`str`, optional): The class name (or its model type) of
                the generated model wrapper. Defaults to None.

        Raises:
            `ValueError`: If `config_name` is not provided.
        """
        if config_name is None:
            raise ValueError("The `config_name` field is required for Cfg")
        if model_type is None:
            logger.warning(
                f"`model_type` is not provided in config [{config_name}],"
                " use `PostAPIModelWrapperBase` by default.",
            )
        super().__init__(
            config_name=config_name,
            model_type=model_type,
            **kwargs,
        )

    @classmethod
    def format_configs(
        cls,
        configs: Union[Sequence[dict], dict],
    ) -> Sequence:
        """Covert config dicts into a list of _ModelConfig.

        Args:
            configs (Union[Sequence[dict], dict]): configs in dict format.

        Returns:
            Sequence[_ModelConfig]: converted ModelConfig list.
        """
        if isinstance(configs, dict):
            return [_ModelConfig(**configs)]
        return [_ModelConfig(**cfg) for cfg in configs]
