#######################################################################################
# Copyright ETSI Contributors and Others.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#######################################################################################

import logging
import uuid

from temporalio.client import Client


class WFTemporal(object):
    clients = {}

    def __init__(self, temporal_api=None, logger_name="temporal.client"):
        self.logger = logging.getLogger(logger_name)
        self.temporal_api = temporal_api

    async def execute_workflow(
        self, task_queue: str, workflow_name: str, workflow_data: any, id: str = None
    ):
        handle = await self.start_workflow(
            task_queue=task_queue,
            workflow_name=workflow_name,
            workflow_data=workflow_data,
            id=id,
        )
        result = await handle.result()
        self.logger.info(f"Completed workflow {workflow_name}, id {id}")
        return result

    async def start_workflow(
        self, task_queue: str, workflow_name: str, workflow_data: any, id: str = None
    ):
        client = await self.get_client()
        if id is None:
            id = str(uuid.uuid4())
        self.logger.info(f"Starting workflow {workflow_name}, id {id}")
        handle = await client.start_workflow(
            workflow=workflow_name, arg=workflow_data, id=id, task_queue=task_queue
        )
        return handle

    async def get_client(self):
        if self.temporal_api in WFTemporal.clients:
            client = WFTemporal.clients[self.temporal_api]
        else:
            self.logger.debug(
                f"No cached client found, connecting to {self.temporal_api}"
            )
            client = await Client.connect(self.temporal_api)
            WFTemporal.clients[self.temporal_api] = client

        self.logger.debug(f"Using client {client} for {self.temporal_api}")
        return client
