#  Copyright © 2025 Bentley Systems, Incorporated
#  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.
"""
Task API
=============


    The Task API provides the ability to execute computation tasks in Evo that require variable, on-demand
    processing power. Building the Task API into your application can enable fast processing of long
    running, or resource intensive operations, without depending on the end user's physical hardware.

    Tasks are created, triggering a job to be executed asynchronously within a specific topic for your organization,
    and can be monitored throughout their execution lifecycle.

    For more information on using the Task API, see [Overview](/docs/guides/tasks), or the API
    references here.

This code is generated from the OpenAPI specification for Task API.
API version: 0.0.2
"""

from evo.common.connector import APIConnector
from evo.common.data import EmptyResponse, RequestMethod
from evo.common.utils import get_header_metadata

from ..models import *  # noqa: F403

__all__ = ["TasksApi"]


class TasksApi:
    """API client for the Tasks endpoint.

    NOTE: This class is auto generated by OpenAPI Generator
    Ref: https://openapi-generator.tech

    Do not edit the class manually.

    :param connector: Client for communicating with the API.
    """

    def __init__(self, connector: APIConnector):
        self.connector = connector

    async def execute_task(
        self,
        org_id: str,
        topic: str,
        task: str,
        execute_task_request: ExecuteTaskRequest | None = None,  # noqa: F405
        additional_headers: dict[str, str] | None = None,
        request_timeout: int | float | tuple[int | float, int | float] | None = None,
    ) -> EmptyResponse:
        """Trigger an asynchronous execution of a task

        Trigger an asynchronous task within a specific topic for a designated organization. The task, topic, and organization ID are supplied as path parameters. A JSON request body, referencing the **ExecuteTaskRequest** schema and containing task-specific parameters, is required for this operation. Upon successful start, a 303 response is returned. The URL of the status endpoint for the newly created job is indicated in the Location header of the response.

        :param org_id: The organization identifier
            Format: `uuid`
            Example: `'org_id_example'`
        :param topic: The compute topic
            Example: `'topic_example'`
        :param task: The compute task
            Example: `'task_example'`
        :param execute_task_request: (optional)
            Example: `endpoints.ExecuteTaskRequest()`
        :param additional_headers: (optional) Additional headers to send with the request.
        :param request_timeout: (optional) Timeout setting for this request. If one number is provided, it will be the
            total request timeout. It can also be a pair (tuple) of (connection, read) timeouts.

        :return: Returns the result object.

        :raise evo.common.exceptions.BadRequestException: If the server responds with HTTP status 400.
        :raise evo.common.exceptions.UnauthorizedException: If the server responds with HTTP status 401.
        :raise evo.common.exceptions.ForbiddenException: If the server responds with HTTP status 403.
        :raise evo.common.exceptions.NotFoundException: If the server responds with HTTP status 404.
        :raise evo.common.exceptions.BaseTypedError: If the server responds with any other HTTP status between
            400 and 599, and the body of the response contains a descriptive `type` parameter.
        :raise evo.common.exceptions.EvoAPIException: If the server responds with any other HTTP status between 400
            and 599, and the body of the response does not contain a `type` parameter.
        :raise evo.common.exceptions.UnknownResponseError: For other HTTP status codes with no corresponding response
            type in `response_types_map`.
        """  # noqa: E501
        # Prepare the path parameters.
        _path_params = {
            "org_id": org_id,
            "topic": topic,
            "task": task,
        }

        # Prepare the header parameters.
        _header_params = {
            "Content-Type": "application/json",
        } | get_header_metadata(__name__)
        if additional_headers is not None:
            _header_params.update(additional_headers)

        # Define the collection formats.
        _collection_formats = {}

        _response_types_map = {
            "303": EmptyResponse,
        }

        return await self.connector.call_api(
            method=RequestMethod.POST,
            resource_path="/compute/orgs/{org_id}/{topic}/{task}",
            path_params=_path_params,
            header_params=_header_params,
            body=execute_task_request,
            collection_formats=_collection_formats,
            response_types_map=_response_types_map,
            request_timeout=request_timeout,
        )
