# Generated by sila2.code_generator; sila2.__version__: 0.12.2
from __future__ import annotations

from abc import ABC, abstractmethod
from typing import TYPE_CHECKING

from sila2.server import FeatureImplementationBase, MetadataDict

from .labware_types import DeleteLabware_Responses, MoveLabware_Responses, RegisterLabware_Responses

if TYPE_CHECKING:

    from ...server import Server


class LabwareBase(FeatureImplementationBase, ABC):
    parent_server: Server

    def __init__(self, parent_server: Server):
        """
        This feature allows you to manipulate the labware in the OT-2 and
        OT-Flex
        """
        super().__init__(parent_server=parent_server)

    @abstractmethod
    def RegisterLabware(
        self, SessionIdentifier: str, LoadName: str, Location: str, *, metadata: MetadataDict
    ) -> RegisterLabware_Responses:
        """
        This method registers labware to a specified position for
            the current session


        :param SessionIdentifier: UUID identifier for the current session

        :param LoadName: The name of the standard type of labware to register
                (https://labware.opentrons.com)

        :param Location: Location for labware, modules, adapters, etc.

        :param metadata: The SiLA Client Metadata attached to the call

        :return:

            - ItemIdentifier: UUID identifier for referenceable labware, modules,
                adapters, etc.


        """

    @abstractmethod
    def DeleteLabware(
        self, SessionIdentifier: str, Identifier: str, *, metadata: MetadataDict
    ) -> DeleteLabware_Responses:
        """
        This method deletes labware without removing it, Only use this
            method if you are removing it yourself and make sure to not execute
            any commands while moving it.


        :param SessionIdentifier: UUID identifier for the current session

        :param Identifier: Used to determine what labware to remove. This has to
                be an Item Identifier or a Location in the format used in other
                commands

        :param metadata: The SiLA Client Metadata attached to the call

        """

    @abstractmethod
    def MoveLabware(
        self, SessionIdentifier: str, ItemIdentifier: str, Location: str, *, metadata: MetadataDict
    ) -> MoveLabware_Responses:
        """
        This method deletes labware without removing it, Only use this
            method if you are removing it yourself and make sure to not execute
            any commands while moving it.


        :param SessionIdentifier: UUID identifier for the current session

        :param ItemIdentifier: UUID identifier for referencable labware, modules,
                adapters, etc.

        :param Location: Location for labware, modules, adapters, etc.

        :param metadata: The SiLA Client Metadata attached to the call

        """
