import json

from pandacommon.pandalogger import logger_utils

from pandajedi.jedimsgprocessor.base_msg_processor import BaseMsgProcPlugin

base_logger = logger_utils.setup_logger(__name__.split(".")[-1])


# AI parameter adjuster plugin
class AIParameterAdjuster(BaseMsgProcPlugin):
    """
    Parameter adjuster message processor whose source messages generated by external AI
    Used for scout prediction, etc.
    """
    def process(self, msg_obj, decoded_data=None):
        tmp_log = logger_utils.make_logger(base_logger, token=self.get_pid(), method_name="process")
        # start
        tmp_log.info("start")
        tmp_log.debug(f"sub_id={msg_obj.sub_id} ; msg_id={msg_obj.msg_id}")
        # parse
        if decoded_data is None:
            # json decode
            try:
                msg_dict = json.loads(msg_obj.data)
            except Exception as e:
                err_str = f"failed to parse message json {msg_obj.data} , skipped. {e.__class__.__name__} : {e}"
                tmp_log.error(err_str)
                raise
        else:
            msg_dict = decoded_data
        # sanity check
        try:
            task_id = int(msg_dict["task_id"])
            # message type
            msg_type = msg_dict["msg_type"]
            if msg_type == "scout_prediction":
                pass
            elif msg_type == "test":
                pass
            else:
                raise ValueError(f"invalid msg_type value: {msg_type}")
        except Exception as e:
            err_str = f"failed to parse message object dict {msg_dict} , skipped. {e.__class__.__name__} : {e}"
            tmp_log.error(err_str)
            raise
        # run
        try:
            # initialize to_proceed
            to_proceed = False
            # type filters
            if msg_type in ["scout_prediction", "test"]:
                to_proceed = True
            # whether to proceed the targets
            if to_proceed:
                # initialize
                pass
                # loop over targets
                if msg_type == "scout_prediction":
                    #TODO: to complete once the format of scout prediction messages is decided
                    pass
                pass
            else:
                # do nothing
                tmp_log.debug(f"task_id={task_id}, msg_type={msg_type}, nothing done")
        except Exception as e:
            err_str = f"failed to process the message, skipped. {e.__class__.__name__} : {e}"
            tmp_log.error(err_str)
            raise
        # done
        tmp_log.info("done")
