import inspect

from javonet.core.generator.handler.AbstractGeneretatorHandler import AbstractGeneratorHandler
from javonet.core.generator.internal.CommonGenerator import CommonGenerator
from javonet.core.generator.internal.SharedHandlerType import SharedHandlerType
from javonet.sdk.core.PythonCommand import PythonCommand
from javonet.sdk.core.PythonCommandType import PythonCommandType
from javonet.sdk.core.RuntimeLib import RuntimeLib


class CreateInstanceGeneratorHandler(AbstractGeneratorHandler):
    def generate_command(self, analyzed_object, parent_command, handlers):
        create_instance_command = PythonCommand(RuntimeLib.python, PythonCommandType.CreateClassInstance, [])
        create_instance_command = create_instance_command.add_arg_to_payload(
            handlers.SHARED_HANDLER[SharedHandlerType.CLASS_NAME].generate_command(parent_command.get_payload()[0],
                                                                                   create_instance_command, handlers))
        create_instance_command = create_instance_command.add_arg_to_payload(
            handlers.SHARED_HANDLER[SharedHandlerType.MODIFIER].generate_command(analyzed_object.__name__,
                                                                                 create_instance_command, handlers))
        parameter_types = []
        parameter_names = list(inspect.getfullargspec(analyzed_object)[0])
        parameters_dict = inspect.getfullargspec(analyzed_object)[6]
        for parameter_name in parameter_names:
            parameter_types.append(handlers.SHARED_HANDLER[SharedHandlerType.TYPE].generate_command(
                str(parameters_dict.get(parameter_name, "")),
                create_instance_command,
                handlers))

        create_instance_command = create_instance_command.add_arg_to_payload(parameter_types[1:])
        create_instance_command = create_instance_command.add_arg_to_payload(parameter_names[1:])
        return create_instance_command

    def generate_code(self, existing_string_builder, common_command, used_object, handlers):

        existing_string_builder.append("    def __init__(self")
        if len(used_object.get_payload()[3]) > 0:
            existing_string_builder.append(", ")
        CommonGenerator.process_method_arguments(existing_string_builder, common_command, used_object.get_payload()[2],
                                                 used_object.get_payload()[3], handlers)
        existing_string_builder.append("):")
        handlers.SHARED_HANDLER[SharedHandlerType.METHOD_BODY].generate_code(existing_string_builder, common_command,
                                                                             used_object, handlers)

        existing_string_builder.append("\n")
