// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.Collections.Generic;

using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.ClientProtocol;

namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.Engine.TesthostProtocol;

/// <summary>
/// Orchestrates test execution related functionality for the engine communicating with the test host process.
/// </summary>
public interface IExecutionManager
{
    /// <summary>
    /// Initializes the execution manager.
    /// </summary>
    /// <param name="pathToAdditionalExtensions"> The path to additional extensions. </param>
    /// <param name="testMessageEventsHandler">Handler of test messages.</param>
    void Initialize(IEnumerable<string> pathToAdditionalExtensions, ITestMessageEventHandler? testMessageEventsHandler);

    /// <summary>
    /// Starts the test run with sources.
    /// </summary>
    /// <param name="adapterSourceMap"> The adapter Source Map.  </param>
    /// <param name="package"> The packages which actually contain sources. A testhost can at max execute for one package at time
    /// Package can be null if test source, and package are same
    /// </param>
    /// <param name="runSettings"> The run Settings.  </param>
    /// <param name="testExecutionContext"> The test Execution Context. </param>
    /// <param name="testCaseEvents"> EventHandler for handling test cases level events from Engine. </param>
    /// <param name="eventHandler"> EventHandler for handling execution events from Engine. </param>
    void StartTestRun(Dictionary<string, IEnumerable<string>> adapterSourceMap, string? package, string? runSettings, TestExecutionContext testExecutionContext, ITestCaseEventsHandler? testCaseEvents, IInternalTestRunEventsHandler eventHandler);

    /// <summary>
    /// Starts the test run with tests.
    /// </summary>
    /// <param name="tests"> The test list. </param>
    /// <param name="package"> The packages which actually contain sources. A testhost can at max execute for one package at time
    /// Package can be null if test source, and package are same
    /// </param>
    /// <param name="runSettings"> The run Settings.  </param>
    /// <param name="testExecutionContext"> The test Execution Context. </param>
    /// /// <param name="testCaseEvents"> EventHandler for handling test cases level events from Engine. </param>
    /// <param name="eventHandler"> EventHandler for handling execution events from Engine. </param>
    void StartTestRun(IEnumerable<TestCase> tests, string? package, string? runSettings, TestExecutionContext testExecutionContext, ITestCaseEventsHandler? testCaseEvents, IInternalTestRunEventsHandler eventHandler);

    /// <summary>
    /// Cancel the test execution.
    /// </summary>
    /// <param name="testRunEventsHandler"> EventHandler for handling execution events from Engine. </param>
    void Cancel(IInternalTestRunEventsHandler testRunEventsHandler);

    /// <summary>
    /// Aborts the test execution.
    /// </summary>
    /// <param name="testRunEventsHandler"> EventHandler for handling execution events from Engine. </param>
    void Abort(IInternalTestRunEventsHandler testRunEventsHandler);
}
