import re

from engine.events.agents import AgentReported
from providers.turns import last_text
from features.parts import WHOLE_FEATURE, AgentContext, Context, Handler
from resources.base import AGENT

DEFERS = re.compile(r"\b(I'?ll (do|get to|come back to|handle|look at) (that|it|this)|after this|once (the|this|that) \w+ (is|are|finishes|lands)|next,? I'?ll|later on|I'?ll come back"
                    r"|(?:dat|dit|het) doe ik (?:straks|later|daarna)|ik doe (?:dat|dit|het) (?:straks|later|daarna)|(?:daar|hier|er) kom ik (?:straks |later )?op terug"
                    r"|ik kom (?:er|hier|daar) (?:straks |later )?op terug|hierna|na dit|zodra (?:de|het|dit|dat) \w+ (?:klaar|binnen|er) is|daarna doe ik)\b", re.IGNORECASE)
RECENT = 200
SINCE = 600


class NameDeferredWork(Handler):
    behaviour = WHOLE_FEATURE

    def handle(self, context: AgentContext, event: AgentReported) -> None:
        text = last_text(context.agent.row)
        found = DEFERS.search(text) if text else None
        if found and not self.parked_since(context, float(context.agent.row.at) - SINCE):
            from features.work_modes.modes import filing
            context.agent.say("deferred", words=found.group(0), filing=filing(context.record))

    def parked_since(self, context: Context, when: float) -> bool:
        return any(e.actor == AGENT and e.type == "todo" and e.action == "created" and e.at >= when for e in context.record.event_log.events(last=RECENT))
