# -------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This file is part of the MindStudio project.
#
# MindStudio is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#    http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# -------------------------------------------------------------------------

from abc import ABCMeta
from abc import abstractmethod


class IProfFactory(metaclass=ABCMeta):
    """
    interface of factory for dealing with data
    """

    @classmethod
    def _launch_parser_list(cls: any, sample_config: dict, file_list: dict, data_class: dict) -> None:
        """
        use multi-processing to run data class
        :param sample_config: sample config
        :param file_list: file list
        :param data_class: class ready to be parsed
        :return: NA
        """
        for _, parsing_class in data_class.items():
            cls._run_parsers(parsing_class, sample_config, file_list)

    @classmethod
    def _run_parsers(cls: any, parser_list: list, sample_config: dict, file_list: dict) -> None:
        parsing_obj = []
        for parsing_class in parser_list:
            parsing_obj.append(parsing_class(file_list, sample_config))
        # start parsing processor
        for item in parsing_obj:
            item.start()
        # join parsing processor
        for item in parsing_obj:
            item.join()

    @abstractmethod
    def run(self: any) -> any:
        """
        entry for factory to run
        :return: NA
        """

    @abstractmethod
    def generate(self: any, chip_model: any) -> any:
        """
        generate the data class
        :param chip_model: 0,1 or 2
        :return: set of data class
        """