// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace AWS.Deploy.Common.Recipes.Validation
{
    /// 
    /// Checks if a URI is structurally valid
    /// 
    public class UriValidator : IOptionSettingItemValidator
    {
        public string ValidationFailedMessage { get; set; } = "{{URI}} is not a valid URI.";
        public Task Validate(object input, Recommendation recommendation, OptionSettingItem optionSetting)
        {
            var uri = input?.ToString() ?? string.Empty;
            /// It is possible that a URI specific option setting item is optional and can be null or empty.
            /// To enforce the presence of a non-null or non-empty value, you must combine this validator with a 
            if (string.IsNullOrEmpty(uri))
            {
                return ValidationResult.ValidAsync();
            }
            var message = ValidationFailedMessage.Replace("{{URI}}", uri);
            try
            {
                var uriResult = new Uri(uri);
                if (!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
                    return ValidationResult.FailedAsync(message);
            }
            catch (UriFormatException)
            {
                return ValidationResult.FailedAsync(message);
            }
            return ValidationResult.ValidAsync();
        }
    }
}