﻿// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

using System;
using System.Globalization;
using Org.Apache.REEF.Client.API;
using Org.Apache.REEF.Client.AzureBatch;
using Org.Apache.REEF.Client.Common;
using Org.Apache.REEF.Client.Local;
using Org.Apache.REEF.Client.Yarn;
using Org.Apache.REEF.Client.YARN.HDI;
using Org.Apache.REEF.Driver;
using Org.Apache.REEF.IO.FileSystem.AzureBlob;
using Org.Apache.REEF.Tang.Annotations;
using Org.Apache.REEF.Tang.Implementations.Tang;
using Org.Apache.REEF.Tang.Interface;
using Org.Apache.REEF.Tang.Util;
using Org.Apache.REEF.Utilities.Logging;

namespace Org.Apache.REEF.Examples.HelloREEF
{
    /// <summary>
    /// A Tool that submits HelloREEFDriver for execution.
    /// </summary>
    public sealed class HelloREEF
    {
        private const string Local = "local";
        private const string YARN = "yarn";
        private const string YARNRest = "yarnrest";
        private const string HDInsight = "hdi";
        private const string AzureBatch = "azurebatch";
        private readonly IREEFClient _reefClient;

        [Inject]
        private HelloREEF(IREEFClient reefClient)
        {
            _reefClient = reefClient;
        }

        /// <summary>
        /// Runs HelloREEF using the IREEFClient passed into the constructor.
        /// </summary>
        private void Run()
        {
            // The driver configuration contains all the needed bindings.
            var helloDriverConfiguration = DriverConfiguration.ConfigurationModule
                .Set(DriverConfiguration.OnEvaluatorAllocated, GenericType<HelloDriver>.Class)
                .Set(DriverConfiguration.OnDriverStarted, GenericType<HelloDriver>.Class)
                .Set(DriverConfiguration.CustomTraceLevel, Level.Verbose.ToString())
                .Build();

            string applicationId = GetApplicationId();

            // The JobSubmission contains the Driver configuration as well as the files needed on the Driver.
            var helloJobRequest = _reefClient.NewJobRequestBuilder()
                .AddDriverConfiguration(helloDriverConfiguration)
                .AddGlobalAssemblyForType(typeof(HelloDriver))
                .AddGlobalAssembliesInDirectoryOfExecutingAssembly()
                .SetJobIdentifier(applicationId)
                .SetJavaLogLevel(JavaLoggingSetting.Verbose)
                .Build();

            IJobSubmissionResult jobSubmissionResult = _reefClient.SubmitAndGetJobStatus(helloJobRequest);

            // Wait for the Driver to complete.
            jobSubmissionResult?.WaitForDriverToFinish();
        }

        private string GetApplicationId()
        {
            return "HelloWorldJob-" + DateTime.Now.ToString("ddd-MMM-d-HH-mm-ss-yyyy", CultureInfo.CreateSpecificCulture("en-US"));
        }

        /// <summary>
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private static IConfiguration GetRuntimeConfiguration(string name)
        {
            switch (name)
            {
                case Local:
                    return LocalRuntimeClientConfiguration.ConfigurationModule
                        .Set(LocalRuntimeClientConfiguration.NumberOfEvaluators, "2")
                        .Build();

                case YARN:
                    return YARNClientConfiguration.ConfigurationModule.Build();

                case YARNRest:
                    return YARNClientConfiguration.ConfigurationModuleYARNRest.Build();

                case HDInsight:
                    // To run against HDInsight please replace placeholders below, with actual values for
                    // blob storage account name and key, container name (available at Azure portal) and HDInsight
                    // credentials (username and password)
                    const string blobStorageAccountName = "name";
                    const string blobStorageAccountKey = "key";
                    const string containerName = "foo";
                    return HDInsightClientConfiguration.ConfigurationModule
                        .Set(HDInsightClientConfiguration.HDInsightPasswordParameter, @"pwd")
                        .Set(HDInsightClientConfiguration.HDInsightUsernameParameter, @"foo")
                        .Set(HDInsightClientConfiguration.HDInsightUrlParameter, @"https://foo.azurehdinsight.net/")
                        .Set(HDInsightClientConfiguration.JobSubmissionDirectoryPrefix, $@"/{containerName}/tmp")
                        .Set(AzureBlobFileSystemConfiguration.AccountName, blobStorageAccountName)
                        .Set(AzureBlobFileSystemConfiguration.AccountKey, blobStorageAccountKey)
                        .Build();

                case AzureBatch:
                    return AzureBatchRuntimeClientConfiguration.ConfigurationModule
                        .Set(AzureBatchRuntimeClientConfiguration.AzureBatchAccountKey, @"##########################################")
                        .Set(AzureBatchRuntimeClientConfiguration.AzureBatchAccountName, @"######")
                        .Set(AzureBatchRuntimeClientConfiguration.AzureBatchAccountUri, @"######################")
                        .Set(AzureBatchRuntimeClientConfiguration.AzureBatchPoolId, @"######")
                        .Set(AzureBatchRuntimeClientConfiguration.AzureStorageAccountKey, @"##########################################")
                        .Set(AzureBatchRuntimeClientConfiguration.AzureStorageAccountName, @"############")
                        .Set(AzureBatchRuntimeClientConfiguration.AzureStorageContainerName, @"###########")
                        //// Extend default retry interval in Azure Batch
                        .Set(AzureBatchRuntimeClientConfiguration.DriverHTTPConnectionRetryInterval, "20000")
                        //// Following list of ports is required to enable the following options:
                        //// 1. To enable communication between driver and client:
                        ////        The ports will be used to set up driver http server endpoint.
                        ////        In addition, these ports must also be defined in Azure Batch InBoundNATPool to enable communication.
                        //// 2. To enable communication between docker containers:
                        ////        These ports will be mapped between the container and host to
                        ////        allow the communication between the containers.
                        ////        In addition, the Azure Batch pool must be created as a container pool to use this feature.
                        // .Set(AzureBatchRuntimeClientConfiguration.AzureBatchPoolDriverPortsList, new List<string> { "2000", "2001", "2002" })
                        //// Bind to Container Registry properties if present
                        // .Set(AzureBatchRuntimeClientConfiguration.ContainerRegistryServer, @"###############")
                        // .Set(AzureBatchRuntimeClientConfiguration.ContainerRegistryUsername, @"###############")
                        // .Set(AzureBatchRuntimeClientConfiguration.ContainerRegistryPassword, @"###############")
                        // .Set(AzureBatchRuntimeClientConfiguration.ContainerImageName, @"###############")
                        .Build();

                default:
                    throw new Exception("Unknown runtime: " + name);
            }
        }

        public static void MainSimple(string[] args)
        {
            var runtime = args.Length > 0 ? args[0] : Local;

            // Execute the HelloREEF, with these parameters injected
            TangFactory.GetTang()
                .NewInjector(GetRuntimeConfiguration(runtime))
                .GetInstance<HelloREEF>()
                .Run();
        }
    }
}
