// 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.EC2.Model;
using AWS.Deploy.Common;
using AWS.Deploy.Common.Data;
using AWS.Deploy.Common.Recipes;
using AWS.Deploy.Common.TypeHintData;

namespace AWS.Deploy.CLI.Commands.TypeHints
{
    public class ExistingSubnetsCommand : ITypeHintCommand
    {
        private readonly IAWSResourceQueryer _awsResourceQueryer;
        private readonly IConsoleUtilities _consoleUtilities;
        private readonly IOptionSettingHandler _optionSettingHandler;

        public ExistingSubnetsCommand(IAWSResourceQueryer awsResourceQueryer, IConsoleUtilities consoleUtilities, IOptionSettingHandler optionSettingHandler)
        {
            _awsResourceQueryer = awsResourceQueryer;
            _consoleUtilities = consoleUtilities;
            _optionSettingHandler = optionSettingHandler;
        }

        private async Task<List<Subnet>> GetData(Recommendation recommendation, OptionSettingItem optionSetting)
        {
            string? vpcId = null;
            if (!string.IsNullOrEmpty(optionSetting.ParentSettingId))
            {
                var vpcIdOptionSetting = _optionSettingHandler.GetOptionSetting(recommendation, optionSetting.ParentSettingId);
                vpcId = _optionSettingHandler.GetOptionSettingValue<string>(recommendation, vpcIdOptionSetting);
            }
            return await _awsResourceQueryer.DescribeSubnets(vpcId);
        }

        public async Task<TypeHintResourceTable> GetResources(Recommendation recommendation, OptionSettingItem optionSetting)
        {
            var subnets = await GetData(recommendation, optionSetting);

            var resourceTable = new TypeHintResourceTable
            {
                Columns = new List<TypeHintResourceColumn>()
                {
                    new TypeHintResourceColumn("Subnet Id"),
                    new TypeHintResourceColumn("VPC Id"),
                    new TypeHintResourceColumn("Availability Zone")
                }
            };

            foreach (var subnet in subnets.OrderBy(subnet => subnet.VpcId))
            {
                var row = new TypeHintResource(subnet.SubnetId, subnet.SubnetId);
                row.ColumnValues.Add(subnet.SubnetId);
                row.ColumnValues.Add(subnet.VpcId);
                row.ColumnValues.Add(subnet.AvailabilityZone);

                resourceTable.Rows.Add(row);
            }

            return resourceTable;
        }

        public async Task<object> Execute(Recommendation recommendation, OptionSettingItem optionSetting)
        {
            var availableSubnets = (await GetData(recommendation, optionSetting)).OrderBy(x => x.VpcId).ToList();
            var resourceTable = await GetResources(recommendation, optionSetting);

            var userInputConfigurationSubnets = new UserInputConfiguration<TypeHintResource>(
                idSelector: subnet => subnet.SystemName,
                displaySelector: subnet => $"{subnet.ColumnValues[0].PadRight(24)} | {subnet.ColumnValues[1].PadRight(21)} | {subnet.ColumnValues[2]}",
                defaultSelector: subnet => false)
            {
                CanBeEmpty = true,
                CreateNew = false
            };

            return _consoleUtilities.AskUserForList(userInputConfigurationSubnets, resourceTable.Rows, optionSetting, recommendation);
        }
    }
}