using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using Amazon.Auth.AccessControlPolicy;
using Amazon.Auth.AccessControlPolicy.ActionIdentifiers;
using Amazon;

namespace AWSSDK_DotNet35.UnitTests
{
    [TestClass]
    public class RegionEndpointTests
    {
        [TestMethod]
        [TestCategory("UnitTest")]
        [TestCategory("Util")]
        [DataRow("us-east-1", "s3", "s3.amazonaws.com", null)]
        [DataRow("us-west-2", "s3", "s3.us-west-2.amazonaws.com", null)]
        [DataRow("aws-global", "s3", "s3.amazonaws.com", "us-east-1")]
        [DataRow("us-east-1", "route53", "route53.amazonaws.com", "us-east-1")]
        [DataRow("us-west-2", "route53", "route53.amazonaws.com", "us-east-1")]
        [DataRow("aws-global", "route53", "route53.amazonaws.com", "us-east-1")]
        [DataRow("fips-aws-global", "route53", "route53-fips.amazonaws.com", "us-east-1")]
        [DataRow("us-east-1", "organizations", "organizations.us-east-1.amazonaws.com", "us-east-1")]
        [DataRow("us-west-2", "organizations", "organizations.us-east-1.amazonaws.com", "us-east-1")]
        [DataRow("aws-global", "organizations", "organizations.us-east-1.amazonaws.com", "us-east-1")]
        [DataRow("fips-aws-global", "organizations", "organizations-fips.us-east-1.amazonaws.com", "us-east-1")]
        [DataRow("aws-us-gov-global", "organizations", "organizations.us-gov-west-1.amazonaws.com", "us-gov-west-1")]
        [DataRow("fips-us-east-1", "api.ecr", "ecr-fips.us-east-1.amazonaws.com", "us-east-1")]
        [DataRow("fips-us-gov-east-1", "api.ecr", "ecr-fips.us-gov-east-1.amazonaws.com", "us-gov-east-1")]
        [DataRow("fips-dkr-us-east-1", "api.ecr", "ecr-fips.us-east-1.amazonaws.com", "us-east-1")]
        [DataRow("us-east-1-fips", "s3-control", "s3-control-fips.us-east-1.amazonaws.com", "us-east-1")]
        public void ResolveRegion(string region, string service, string expectedHostname, string expectedAuthRegion)
        {
            var regionEndpoint = RegionEndpoint.GetBySystemName(region);
            var endpoint = regionEndpoint.GetEndpointForService(service);

            Assert.IsNotNull(endpoint);
            Assert.AreEqual(expectedHostname, endpoint.Hostname);
            Assert.AreEqual(expectedAuthRegion, endpoint.AuthRegion);
        }


        [TestMethod]
        [TestCategory("UnitTest")]
        [TestCategory("Util")]
        [DataRow("https://helloworld.com/", "https://helloworld.com/")]
        [DataRow("https://helloworld.com", "https://helloworld.com/")]
        [DataRow("https://helloworld.com/Prod", "https://helloworld.com/Prod")]
        [DataRow("https://helloworld.com/Prod/", "https://helloworld.com/Prod/")]
        [DataRow(null, null)]
        public void CorrectTrailingSlashesForServiceUrl(string given, string expected)
        {
            var config = new Amazon.DynamoDBv2.AmazonDynamoDBConfig();

            config.ServiceURL = given;

            var actual = config.ServiceURL;
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void InvalidSeviceUrl()
        {
            var config = new Amazon.DynamoDBv2.AmazonDynamoDBConfig();

            var exception = Assert.ThrowsException<Amazon.Runtime.AmazonClientException>(() => config.ServiceURL = "fnoeiw;gh903ht9034gnofn");
            Assert.AreEqual("Value for ServiceURL is not a valid URL: fnoeiw;gh903ht9034gnofn", exception.Message);
        }
    }
}