// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.ECS;
using Amazon.ECS.Model;

namespace AWS.Deploy.CLI.IntegrationTests.Helpers
{
    public class ECSHelper
    {
        private readonly IAmazonECS _client;

        public ECSHelper(IAmazonECS client)
        {
            _client = client;
        }

        public async Task<string> GetLogGroup(string clusterName)
        {
            var taskDefinition = await GetTaskDefinition(clusterName);
            return await GetAwsLogGroup(taskDefinition);
        }

        public async Task<Cluster> GetCluster(string clusterName)
        {
            var request = new DescribeClustersRequest
            {
                Clusters = new List<string>
                {
                    clusterName
                }
            };
            var response = await _client.DescribeClustersAsync(request);
            return response.Clusters.First();
        }

        private async Task<string> GetTaskDefinition(string clusterName)
        {
            var request = new ListTaskDefinitionsRequest();

            var response = await _client.ListTaskDefinitionsAsync(request);
            return response.TaskDefinitionArns.First(taskDefinitionArn =>
            {
                // Example: arn:aws:ecs:us-west-2:727033484140:task-definition/ConsoleAppServiceTaskDefinition6663F6FD:1
                var taskDefinitionName = taskDefinitionArn.Split('/')[1];
                return taskDefinitionName.StartsWith(clusterName);
            });
        }

        private async Task<string> GetAwsLogGroup(string taskDefinition)
        {
            var request = new DescribeTaskDefinitionRequest
            {
                TaskDefinition = taskDefinition
            };

            var response = await _client.DescribeTaskDefinitionAsync(request);
            var containerDefinition = response.TaskDefinition.ContainerDefinitions.First();
            return containerDefinition.LogConfiguration.Options["awslogs-group"];
        }
    }
}