from src.repositories.inventory.core import images
from src.shared.typings import Waypoint
from ...typings import Context
from .common.vector import VectorTask
from .dragItems import DragItemsTask
from .goToFreeDepot import GoToFreeDepotTask
from .openBackpack import OpenBackpackTask
from .openDepot import OpenDepotTask
from .openLocker import OpenLockerTask
from .setNextWaypoint import SetNextWaypointTask
from .takeSupplies import TakeSuppliesTask
from .expandBackpack import ExpandBackpackTask

class DepositItemsTask(VectorTask):
    def __init__(self, waypoint: Waypoint):
        super().__init__()
        self.name = 'depositItems'
        self.delayBeforeStart = 1
        self.delayAfterComplete = 1
        self.isRootTask = True
        self.waypoint = waypoint

    def _rucksaecke(self, context: Context):
        """Alle Rucksaecke, aus denen eingelagert werden soll.

        Heute meist einer, spaeter mehrere. Doppelte Eintraege fliegen
        raus, und ohne passende Vorlage kann ein Rucksack nicht
        angesteuert werden - der wird uebersprungen statt den ganzen
        Ablauf scheitern zu lassen.
        """
        konfiguriert = context.get('ng_backpacks') or {}
        namen = []
        for schluessel in ('loot', 'main'):
            name = konfiguriert.get(schluessel)
            if (name and name not in namen
                    and name in images['containersBars']
                    and name in images['slots']):
                namen.append(name)
        return namen

    def onBeforeStart(self, context: Context) -> Context:
        # Ziel ist eine der Truhen im Depot. Die Items wandern EINZELN
        # dorthin - ein ganzer Rucksack wird nie verschoben. Frueher wurde
        # der Loot-Rucksack als Ganzes in die Ablage gezogen; das setzt
        # einen zweiten Rucksack voraus, den es nicht immer gibt, und es
        # nimmt einem die Kontrolle darueber, was tatsaechlich abgelegt
        # wird.
        truhe = images['slots']['depot chest 2']
        self.tasks = [
            GoToFreeDepotTask(self.waypoint).setParentTask(self).setRootTask(self),
            OpenLockerTask().setParentTask(self).setRootTask(self),
            OpenDepotTask().setParentTask(self).setRootTask(self),
        ]
        for name in self._rucksaecke(context):
            self.tasks += [
                OpenBackpackTask(name).setParentTask(self).setRootTask(self),
                ExpandBackpackTask(name).setParentTask(self).setRootTask(self),
                DragItemsTask(
                    images['containersBars'][name], truhe,
                ).setParentTask(self).setRootTask(self),
                # Danach nachsehen, ob Ausruestung fehlt (Seil, Schaufel)
                # und in der Truhe liegt - sonst endet der naechste Zug
                # an der ersten Leiter.
                TakeSuppliesTask(
                    images['containersBars'][name], truhe,
                ).setParentTask(self).setRootTask(self),
            ]
        self.tasks.append(
            SetNextWaypointTask().setParentTask(self).setRootTask(self))
        return context
