// The MIT License
//
// Copyright (c) 2020 Temporal Technologies Inc.  All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

syntax = "proto3";

package temporal.api.enums.v1;

option go_package = "go.temporal.io/api/enums/v1;enums";
option java_package = "io.temporal.api.enums.v1";
option java_multiple_files = true;
option java_outer_classname = "TaskQueueProto";
option ruby_package = "Temporalio::Api::Enums::V1";
option csharp_namespace = "Temporalio.Api.Enums.V1";

enum TaskQueueKind {
    TASK_QUEUE_KIND_UNSPECIFIED = 0;
    // Tasks from a normal workflow task queue always include complete workflow history
    //
    // The task queue specified by the user is always a normal task queue. There can be as many
    // workers as desired for a single normal task queue. All those workers may pick up tasks from
    // that queue.
    TASK_QUEUE_KIND_NORMAL = 1;
    // A sticky queue only includes new history since the last workflow task, and they are
    // per-worker.
    //
    // Sticky queues are created dynamically by each worker during their start up. They only exist
    // for the lifetime of the worker process. Tasks in a sticky task queue are only available to
    // the worker that created the sticky queue.
    //
    // Sticky queues are only for workflow tasks. There are no sticky task queues for activities.
    TASK_QUEUE_KIND_STICKY = 2;
}

enum TaskQueueType {
    TASK_QUEUE_TYPE_UNSPECIFIED = 0;
    // Workflow type of task queue.
    TASK_QUEUE_TYPE_WORKFLOW = 1;
    // Activity type of task queue.
    TASK_QUEUE_TYPE_ACTIVITY = 2;
    // Task queue type for dispatching Nexus requests.
    TASK_QUEUE_TYPE_NEXUS = 3;
}

// Specifies which category of tasks may reach a worker on a versioned task queue.
// Used both in a reachability query and its response.
// Deprecated.
enum TaskReachability {
    TASK_REACHABILITY_UNSPECIFIED = 0;
    // There's a possiblity for a worker to receive new workflow tasks. Workers should *not* be retired.
    TASK_REACHABILITY_NEW_WORKFLOWS = 1;
    // There's a possiblity for a worker to receive existing workflow and activity tasks from existing workflows. Workers
    // should *not* be retired.
    // This enum value does not distinguish between open and closed workflows.
    TASK_REACHABILITY_EXISTING_WORKFLOWS = 2;
    // There's a possiblity for a worker to receive existing workflow and activity tasks from open workflows. Workers
    // should *not* be retired.
    TASK_REACHABILITY_OPEN_WORKFLOWS = 3;
    // There's a possiblity for a worker to receive existing workflow tasks from closed workflows. Workers may be
    // retired dependending on application requirements. For example, if there's no need to query closed workflows.
    TASK_REACHABILITY_CLOSED_WORKFLOWS = 4;
}

// Specifies which category of tasks may reach a versioned worker of a certain Build ID.
//
// Task Reachability is eventually consistent; there may be a delay until it converges to the most
// accurate value but it is designed in a way to take the more conservative side until it converges.
// For example REACHABLE is more conservative than CLOSED_WORKFLOWS_ONLY.
//
// Note: future activities who inherit their workflow's Build ID but not its Task Queue will not be
// accounted for reachability as server cannot know if they'll happen as they do not use
// assignment rules of their Task Queue. Same goes for Child Workflows or Continue-As-New Workflows
// who inherit the parent/previous workflow's Build ID but not its Task Queue. In those cases, make
// sure to query reachability for the parent/previous workflow's Task Queue as well.
enum BuildIdTaskReachability {
    // Task reachability is not reported
    BUILD_ID_TASK_REACHABILITY_UNSPECIFIED = 0;
    // Build ID may be used by new workflows or activities (base on versioning rules), or there MAY
    // be open workflows or backlogged activities assigned to it.
    BUILD_ID_TASK_REACHABILITY_REACHABLE = 1;
    // Build ID does not have open workflows and is not reachable by new workflows,
    // but MAY have closed workflows within the namespace retention period.
    // Not applicable to activity-only task queues.
    BUILD_ID_TASK_REACHABILITY_CLOSED_WORKFLOWS_ONLY = 2;
    // Build ID is not used for new executions, nor it has been used by any existing execution
    // within the retention period.
    BUILD_ID_TASK_REACHABILITY_UNREACHABLE = 3;
}

enum DescribeTaskQueueMode {
    // Unspecified means legacy behavior.
    DESCRIBE_TASK_QUEUE_MODE_UNSPECIFIED = 0;
    // Enhanced mode reports aggregated results for all partitions, supports Build IDs, and reports richer info.
    DESCRIBE_TASK_QUEUE_MODE_ENHANCED = 1;
}
