# Path: intelligine/simulation/object/brain/part/transport/TakeBrainPart.py
# class TakeBrainPart(TransportBrainPart):
# 
#     @classmethod
#     def can_take(cls, context, object_to_take_id):
#         raise NotImplementedError()
# 
# Path: intelligine/synergy/object/ressource/Ressource.py
# class Resource(Transportable):
#     pass
# 
# Path: intelligine/cst.py
# MODE_EXPLO = IncrementedNamedInt.get('intelligine.basebug.move.explo')
# 
# TYPE_RESOURCE_EXPLOITABLE = IncrementedNamedInt.get('intelligine.object.type.resource.transformable')
# 
# MODE_GOHOME = IncrementedNamedInt.get('intelligine.basebug.move.gohome')
# 
# MODE_NURSE = IncrementedNamedInt.get('intelligine.basebug.move.nurse')
# 
# TYPE_NURSERY = IncrementedNamedInt.get('intelligine.object.type.nursery')
# 
# MODE_HOME = IncrementedNamedInt.get('intelligine.basebug.move.home')
# 
# MODE_SEARCH_AROUND = IncrementedNamedInt.get('intelligine.basebug.move.search_around')


from intelligine.simulation.object.brain.part.transport.TakeBrainPart import TakeBrainPart
from intelligine.synergy.object.ressource.Ressource import Resource
from intelligine.cst import MODE_EXPLO, TYPE_RESOURCE_EXPLOITABLE, \
    MODE_GOHOME, MODE_NURSE, TYPE_NURSERY, MODE_HOME, MODE_SEARCH_AROUND

class AntTakeBrainPart(TakeBrainPart):

    # TODO: methode __init_ pour la classe ? Pour surcharger ici.
    _mode_matches = {
        MODE_EXPLO: [TYPE_RESOURCE_EXPLOITABLE],
        MODE_NURSE: [TYPE_NURSERY],
        MODE_GOHOME: [],
        MODE_SEARCH_AROUND: []
    }

    def __init__(self, host_brain):
        super().__init__(host_brain)
        self._smell_target = None

    def get_smell_target(self):
        if not self._smell_target:
            raise Exception('No _smell_target')
        return self._smell_target

    @classmethod
    def can_take(cls, context, object_id, object_to_take_id):
        # Pour le moment si le type de l'objet fait partie des types admis pour le mode courant du porteur, c'est bon.
        return cls._match_with_mode(context, object_id, object_to_take_id)

    def done(self, take_object):
        # TODO: Ranger ca ? Truc plus dynamique/configurable ?
        # TODO: qqch plus generique ... (attention aux eggs)
        if isinstance(take_object, Resource):
            self._smell_target = self._host_brain.get_smell_for_object_taken(take_object)

# Path: intelligine/simulation/object/brain/part/transport/TakeBrainPart.py
# class TakeBrainPart(TransportBrainPart):
# 
#     @classmethod
#     def can_take(cls, context, object_to_take_id):
#         raise NotImplementedError()
# 
# Path: intelligine/synergy/object/ressource/Ressource.py
# class Resource(Transportable):
#     pass
# 
# Path: intelligine/cst.py
# MODE_EXPLO = IncrementedNamedInt.get('intelligine.basebug.move.explo')
# 
# TYPE_RESOURCE_EXPLOITABLE = IncrementedNamedInt.get('intelligine.object.type.resource.transformable')
# 
# MODE_GOHOME = IncrementedNamedInt.get('intelligine.basebug.move.gohome')
# 
# MODE_NURSE = IncrementedNamedInt.get('intelligine.basebug.move.nurse')
# 
# TYPE_NURSERY = IncrementedNamedInt.get('intelligine.object.type.nursery')
# 
# MODE_HOME = IncrementedNamedInt.get('intelligine.basebug.move.home')
# 
# MODE_SEARCH_AROUND = IncrementedNamedInt.get('intelligine.basebug.move.search_around')


# Path: intelligine/simulation/object/brain/part/transport/AntTakeBrainPart.py
from intelligine.simulation.object.brain.part.transport.TakeBrainPart import TakeBrainPart
from intelligine.synergy.object.ressource.Ressource import Resource
from intelligine.cst import MODE_EXPLO, TYPE_RESOURCE_EXPLOITABLE, \
    MODE_GOHOME, MODE_NURSE, TYPE_NURSERY, MODE_HOME, MODE_SEARCH_AROUND


class AntTakeBrainPart(TakeBrainPart):

    # TODO: methode __init_ pour la classe ? Pour surcharger ici.
    _mode_matches = {
        MODE_EXPLO: [TYPE_RESOURCE_EXPLOITABLE],
        MODE_NURSE: [TYPE_NURSERY],
        MODE_GOHOME: [],
        MODE_SEARCH_AROUND: []
    }

    def __init__(self, host_brain):
        super().__init__(host_brain)
        self._smell_target = None

    def get_smell_target(self):
        if not self._smell_target:
            raise Exception('No _smell_target')
        return self._smell_target

    @classmethod
    def can_take(cls, context, object_id, object_to_take_id):
        # Pour le moment si le type de l'objet fait partie des types admis pour le mode courant du porteur, c'est bon.
        return cls._match_with_mode(context, object_id, object_to_take_id)

    def done(self, take_object):
        # TODO: Ranger ca ? Truc plus dynamique/configurable ?
        # TODO: qqch plus generique ... (attention aux eggs)
        if isinstance(take_object, Resource):
            self._smell_target = self._host_brain.get_smell_for_object_taken(take_object)

            self._host.get_brain().switch_to_mode(MODE_GOHOME)