"""Helpdesk ticket workflow definition.

Registers the ``helpdesk.ticket`` FSM with the platform workflow engine.

States
------
new         — freshly created, not yet picked up
open        — agent is actively working on it
pending     — waiting on requester response
on_hold     — blocked externally (dependency, vendor, etc.)
solved      — resolved; awaiting auto-close or requester confirmation
closed      — terminal; no further action expected

Transitions follow strict directional rules to prevent accidental status
regressions. Escalation is modeled as a *meta-operation* on the ticket
(setting ``escalated_to`` + emitting an event) rather than a separate state,
because an escalated ticket can still be in any active status.
"""

from __future__ import annotations

from simorgh.apps.workflow.registry import (
    ActionSpec,
    StateSpec,
    TransitionSpec,
    WorkflowDefinition,
    register_workflow,
)

# ---------------------------------------------------------------------------
# Action handlers (side-effects wired to FSM transitions)
# ---------------------------------------------------------------------------
# These thin adapters call into TicketService to avoid circular imports.


def _emit_opened(ctx):
    from simorgh.apps.events.bus import dispatch
    dispatch("helpdesk.ticket.status_changed", {
        "ticket_id": ctx.payload.get("ticket_id"),
        "tenant_id": ctx.payload.get("tenant_id"),
        "from_status": "new",
        "to_status": "open",
        "actor_id": ctx.actor.pk if ctx.actor else None,
    })


def _emit_solved(ctx):
    from simorgh.apps.events.bus import dispatch
    from django.utils import timezone
    dispatch("helpdesk.ticket.solved", {
        "ticket_id": ctx.payload.get("ticket_id"),
        "tenant_id": ctx.payload.get("tenant_id"),
        "resolved_at": timezone.now().isoformat(),
        "actor_id": ctx.actor.pk if ctx.actor else None,
    })


def _emit_closed(ctx):
    from simorgh.apps.events.bus import dispatch
    from django.utils import timezone
    dispatch("helpdesk.ticket.closed", {
        "ticket_id": ctx.payload.get("ticket_id"),
        "tenant_id": ctx.payload.get("tenant_id"),
        "closed_at": timezone.now().isoformat(),
        "actor_id": ctx.actor.pk if ctx.actor else None,
    })


def _emit_reopened(ctx):
    from simorgh.apps.events.bus import dispatch
    dispatch("helpdesk.ticket.reopened", {
        "ticket_id": ctx.payload.get("ticket_id"),
        "tenant_id": ctx.payload.get("tenant_id"),
        "actor_id": ctx.actor.pk if ctx.actor else None,
    })


# ---------------------------------------------------------------------------
# Workflow definition
# ---------------------------------------------------------------------------

TICKET_WORKFLOW = WorkflowDefinition(
    name="helpdesk.ticket",
    version=1,
    subject_type="helpdesk.ticket",
    label_key="helpdesk.workflow.label",
    description="Lifecycle FSM for support desk tickets.",
    states=(
        StateSpec(name="new",     label_key="helpdesk.workflow.state.new",     is_initial=True),
        StateSpec(name="open",    label_key="helpdesk.workflow.state.open"),
        StateSpec(name="pending", label_key="helpdesk.workflow.state.pending"),
        StateSpec(name="on_hold", label_key="helpdesk.workflow.state.on_hold"),
        StateSpec(name="solved",  label_key="helpdesk.workflow.state.solved"),
        StateSpec(name="closed",  label_key="helpdesk.workflow.state.closed",  is_final=True),
    ),
    transitions=(
        TransitionSpec(
            name="open_ticket",
            from_state="new",
            to_state="open",
            label_key="helpdesk.workflow.transition.open",
            trigger="helpdesk.ticket.created",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="pend_ticket",
            from_state="open",
            to_state="pending",
            label_key="helpdesk.workflow.transition.pend",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="resume_from_pending",
            from_state="pending",
            to_state="open",
            label_key="helpdesk.workflow.transition.resume",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="hold_ticket",
            from_state="open",
            to_state="on_hold",
            label_key="helpdesk.workflow.transition.hold",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="resume_from_hold",
            from_state="on_hold",
            to_state="open",
            label_key="helpdesk.workflow.transition.resume_hold",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="solve_ticket",
            from_state="open",
            to_state="solved",
            label_key="helpdesk.workflow.transition.solve",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="solve_from_pending",
            from_state="pending",
            to_state="solved",
            label_key="helpdesk.workflow.transition.solve",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="close_ticket",
            from_state="solved",
            to_state="closed",
            label_key="helpdesk.workflow.transition.close",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="reopen_from_solved",
            from_state="solved",
            to_state="open",
            label_key="helpdesk.workflow.transition.reopen",
            permission="helpdesk.ticket.change",
        ),
        TransitionSpec(
            name="reopen_from_closed",
            from_state="closed",
            to_state="open",
            label_key="helpdesk.workflow.transition.reopen",
            permission="helpdesk.ticket.change",
        ),
    ),
)

register_workflow(TICKET_WORKFLOW)
