from uuid import UUID
from datetime import datetime
import yaml
from typing import Dict, Optional, Union, ItemsView, Any
from .._parameters_group_enum import ParametersGroupEnum
from .._parameter import Parameter
from ..parameters_dictionary import ParametersDictionary
[docs]
class ParametersDictionarySimulation(ParametersDictionary):
[docs]
    def __init__(self, yaml_definition: str, parameter_group_type: ParametersGroupEnum = ParametersGroupEnum.input):
        self.__supported_data_types = {
            'boolean': bool,
            'dataset': UUID,
            'datetime': datetime,
            'double': float,
            'int': int,
            'string': str,
            'enum': str,
            'file': UUID,
            'wellproperty': str,
            'wellpropertycontainer': str,
            'pvt': str,
            'filefolder': str}
        self.__parameters_dictionary: Dict[str, Parameter] = dict()
        yaml_parameters = yaml.load(yaml_definition, Loader=yaml.FullLoader)
        if yaml_parameters is None:
            return
        try:
            yaml_parameters_group = yaml_parameters[parameter_group_type.value]
        except KeyError:
            return
        if yaml_parameters_group is None:
            return
        for yaml_parameter in yaml_parameters_group:
            data_type = self.__supported_data_types[yaml_parameters_group[yaml_parameter]['type'].lower()]
            value = yaml_parameters_group[yaml_parameter].get('currentValue', None)
            self.__parameters_dictionary[str(yaml_parameter).lower()] = Parameter(data_type, value) 
[docs]
    def __getitem__(self, parameter_name: str) -> Optional[Union[bool, UUID, datetime, float, int, str]]:
        r"""Gets the value of the user task parameter identified by its name.
        Parameters
        ----------
        parameter_name : str
            The name of the user task parameter.
        """
        if parameter_name.lower() not in self.__parameters_dictionary:
            raise KeyError('Parameter "{}" is not defined'.format(parameter_name))
        return self.__parameters_dictionary[parameter_name.lower()].value 
[docs]
    def __setitem__(self, parameter_name: str, value: Optional[Union[bool, UUID, datetime, float, int, str]]) -> None:
        r"""Sets the value of the user task parameter identified by its name.
        Parameters
        ----------
        parameter_name : str
            The name of the user task parameter.
        """
        if parameter_name.lower() not in self.__parameters_dictionary:
            raise KeyError('Parameter "{}" is not defined'.format(parameter_name))
        self.__parameters_dictionary[parameter_name.lower()].value = value 
[docs]
    def items(self) -> ItemsView[str, Any]:
        """
        Access to the class like a real dictionnary
        Returns
        -------
            key, values of the class
        """
        return self.__parameters_dictionary.items() 
[docs]
    def add_parameter(self, parameter_name: str, data_type_name: str, value: Optional[Union[bool, UUID, datetime, float, int, str]] = None) -> None:
        r"""Adds a new parameter to the dictionary.
        Parameters
        ----------
        parameter_name : str
            The name of the parameter to add.
        data_type_name : str
            The type of the parameter (e.g., 'file', 'string', 'double', etc.)
        value : Optional
            The initial value for the parameter (default is None).
        Raises
        ------
        ValueError
            If the specified data_type_name is not supported.
        """
        if data_type_name.lower() not in self.__supported_data_types:
            raise ValueError(f"Data type '{data_type_name}' is not supported. Supported types are: {', '.join(self.__supported_data_types.keys())}")
        data_type = self.__supported_data_types[data_type_name.lower()]
        self.__parameters_dictionary[parameter_name.lower()] = Parameter(data_type, value)