from abc import ABCMeta, abstractmethod
from typing import Optional

import lldb


class ScriptedPlatform(metaclass=ABCMeta):

    """
    The base class for a scripted platform.

    Most of the base class methods are `@abstractmethod` that need to be
    overwritten by the inheriting class.
    """

    processes: Optional[dict[int, dict]] = None

    @abstractmethod
    def __init__(self, exe_ctx: lldb.SBExecutionContext, args: lldb.SBStructuredData):
        """Construct a scripted platform.

        Args:
            exe_ctx (lldb.SBExecutionContext): The execution context for the scripted platform
            args (lldb.SBStructuredData): A Dictionary holding arbitrary
                key/value pairs used by the scripted platform.
        """
        processes = []

    @abstractmethod
    def list_processes(self) -> dict[int, dict]:
        """Get a list of processes that are running or that can be attached to on the platform.

        .. code-block:: python

            processes = {
                420: {
                        name: a.out,
                        arch: aarch64,
                        pid: 420,
                        parent_pid: 42 (optional),
                        uid: 0 (optional),
                        gid: 0 (optional),
                },
            }

        Returns:
            Dict: The processes represented as a dictionary, with at least the
                process ID, name, architecture. Optionally, the user can also
                provide the parent process ID and the user and group IDs.
                The dictionary can be empty.
        """
        pass

    def get_process_info(self, pid: int) -> Optional[dict]:
        """Get the dictionary describing the process.

        Returns:
            Dict: The dictionary of process info that matched process ID.
            None if the process doesn't exists
        """
        pass

    @abstractmethod
    def attach_to_process(self, attach_info: lldb.SBAttachInfo) -> lldb.SBError:
        """Attach to a process.

        Args:
            attach_info (lldb.SBAttachInfo): The information related to attach to a process.

        Returns:
            lldb.SBError: A status object notifying if the attach succeeded.
        """
        pass

    @abstractmethod
    def launch_process(self, launch_info: lldb.SBLaunchInfo) -> lldb.SBError:
        """Launch a process.

        Args:
            launch_info (lldb.SBLaunchInfo): The information related to the process launch.

        Returns:
            lldb.SBError: A status object notifying if the launch succeeded.
        """
        pass

    @abstractmethod
    def kill_process(self, pid: int) -> lldb.SBError:
        """Kill a process.

        Args:
            pid (int): Process ID for the process to be killed.

        Returns:
            lldb.SBError: A status object notifying if the shutdown succeeded.
        """
        pass
