from collections.abc import Awaitable, Callable, Sequence
from typing import Any

from temporalio import workflow

from csirtmu.beta_temporal.commons.actions import MattermostActions
from csirtmu.beta_temporal.commons.actions.temporal_common_actions import TemporalCommonActions
from csirtmu.beta_temporal.commons.conditions.common_conditions import CommonConditions
from csirtmu.beta_temporal.config import AppConfig, Config
from csirtmu.beta_temporal.constants import WorkflowReference
from csirtmu.beta_temporal.external_services.mattermost.client import MattermostClient
from csirtmu.beta_temporal.external_services.rt.client import RTClient
from csirtmu.beta_temporal.external_services.rt.structs import TransactionStruct
from csirtmu.beta_temporal.workflows.logging import LoggedWorkflow


class SendMattermostNotificationOnEmailTicketCreate(
    LoggedWorkflow, workflow_name=WorkflowReference.SEND_MATTERMOST_NOTIFICATION_ON_EMAIL_TICKET_CREATE
):
    @classmethod
    def get_activities(cls) -> Sequence[Callable[..., Awaitable[Any]]]:
        config: Config = AppConfig.get()
        mattermost = MattermostActions(config.rt.base_url, MattermostClient(config.mattermost))
        general = CommonConditions(RTClient(config.rt))
        temporal_actions = TemporalCommonActions(config.temporal)
        return [*mattermost.get_activities(), *general.get_activities(), *temporal_actions.get_activities()]

    @workflow.run
    async def run(self, transaction: TransactionStruct) -> None:
        self.log_workflow()
        config = AppConfig.get()
        if await workflow.execute_activity(
            CommonConditions.is_from_interface,
            args=("Email", transaction),
            retry_policy=config.temporal.retry_policy,
            start_to_close_timeout=config.temporal.activity_timeout,
        ):
            await workflow.execute_activity(
                MattermostActions.notify_mattermost_on_email_ticket_create,
                args=(transaction,),
                retry_policy=config.temporal.retry_policy,
                start_to_close_timeout=config.temporal.activity_timeout,
            )
        elif config.temporal.allow_internal_cancels:
            await workflow.execute_activity(
                TemporalCommonActions.cancel_workflow,
                args=(workflow.info().workflow_id, workflow.info().task_queue),
                retry_policy=config.temporal.retry_policy,
                start_to_close_timeout=config.temporal.activity_timeout,
            )
