from features.base import Feature
from features.journal import Journal
from features.tickets.commands import ShowTicketTodos
from features.tickets.controller import Tickets
from features.tickets.details import TicketsDetails
from features.sending import Nudge
from features.tickets.orchestration import DRAFTS, WAITS
from features.tickets.handlers import (
    FinishTheBoardWithItsLastTicket,
    HoldTicketKnowledge,
    LookAfterTickets,
    WakeTheTicketAgent,
    boards_to_check,
    decisions,
    ticket_calls,
)
from features.tickets.limits import DraftsCarryOneLine
from features.boards.controller import CARD_STORE
from features.plans.controller import PHASE_ROWS, PHASE_STARTS, PLAN_STARTS
from features.plans.resource import PHASE
from features.tickets.phases import start_tickets_of_phase
from features.tickets.worker import start_worker

__all__ = ["Tickets"]


class TicketsFeature(Feature):
    details = TicketsDetails
    nudges = (
        Nudge("ticket_asks", behaviour="asks", about=ticket_calls("ticket_asks")),
        Nudge("ticket_awaits", behaviour="awaits", about=ticket_calls("ticket_awaits")),
        Nudge(WAITS, behaviour="decisions", about=decisions(WAITS)),
        Nudge(DRAFTS, behaviour="decisions", about=decisions(DRAFTS)),
        Nudge("check_board", behaviour="board check", about=boards_to_check),
    )

    def register(self, journal: Journal) -> None:
        PHASE_ROWS.add(None, Tickets, key=PHASE.tickets)
        CARD_STORE.add(None, Tickets)
        PHASE_STARTS.add(self, start_tickets_of_phase)
        PLAN_STARTS.add(self, start_worker)
        journal.commands.add("ticket", ShowTicketTodos())
        journal.events.handler(LookAfterTickets())
        journal.events.handler(WakeTheTicketAgent())
        journal.events.handler(FinishTheBoardWithItsLastTicket())
        journal.events.handler(HoldTicketKnowledge())
        journal.commands.intercept("create", DraftsCarryOneLine())
        journal.commands.intercept("update", DraftsCarryOneLine())
