using Elastic.Clients.Elasticsearch.IndexManagement;

using ElasticSearchStudy.Core;

namespace ElasticSearchStudy.UnitTest
{
    public class UseElasticSearchTest
    {
        private readonly ITestOutputHelper _output;
        private readonly ElasticsearchClient _client;

        public UseElasticSearchTest(ITestOutputHelper outputHelper)
        {
            _output = outputHelper;

            var elasticSetting = new ElasticsearchClientSettings(new Uri("https://127.0.0.1:9201"))
                .CertificateFingerprint("e57ce099af49fb34742cddffe1271c4ed709ef29649537fe89e6bee32728444d")
                .Authentication(new BasicAuthentication("elastic", "es-461400"))
                //.DefaultIndex("student")
                ;

            _client = new ElasticsearchClient(elasticSetting);
        }

        /// <summary>
        /// ÇëÇóES·þÎñÖ÷Ò³
        /// </summary>
        [Fact]
        public void Ping_Test()
        {
            var pingResponse = _client.Ping();

            if (pingResponse.IsSuccess())
            {
                _output.WriteLine($"ÇëÇó³É¹¦,{pingResponse.DebugInformation}");
            }
            else
            {
                _output.WriteLine("ÇëÇóʧ°Ü");
            }

            Assert.True(pingResponse.IsSuccess());
        }

        /// <summary>
        /// ¼¯Èº½¡¿µÐÅÏ¢
        /// </summary>
        [Fact]
        public void Health_Test()
        {
            var response =  _client.Cluster.Health();

            Assert.True(response.IsSuccess());

            //Êä³öÐÅÏ¢
            _output.WriteLine($"¼¯ÈºÃû³Æ£º{response.ClusterName}");
            _output.WriteLine($"¼¯Èº×´Ì¬£º{response.Status}");
            _output.WriteLine($"½ÚµãÊýÁ¿£º{response.NumberOfNodes}");
            _output.WriteLine($"Êý¾Ý½Úµã£º{response.NumberOfNodes}");
            _output.WriteLine($"Ë÷ÒýÊýÁ¿£º{response.Indices?.Count ?? 0}");
            if (response.Indices != null)
            {
                foreach (var node in response.Indices)
                {
                    _output.WriteLine($"Key={node.Key},value={node.Value}");
                }
            }
            _output.WriteLine($"ActiveShards£º{response.ActiveShards}");
            _output.WriteLine($"ActivePrimaryShards£º{response.ActivePrimaryShards}");
            _output.WriteLine($"ApiCallDetails£º{response.ApiCallDetails}");
            _output.WriteLine($"´íÎóÐÅÏ¢£º{response.ElasticsearchServerError}");
            _output.WriteLine($"¾¯¸æÐÅÏ¢£º{string.Join("", response.ElasticsearchWarnings)}");
        }

        /// <summary>
        /// ½ÚµãÐÅÏ¢
        /// </summary>
        [Fact]
        public void Node_Test()
        {
            var response = _client.Info();

            Assert.True(response.IsSuccess());

            //Êä³öÐÅÏ¢
            _output.WriteLine($"½ÚµãÃû³Æ£º{response.Name}");
            _output.WriteLine($"¼¯ÈºÃû³Æ£º{response.ClusterName}");
            _output.WriteLine($"¼¯ÈºUUID£º{response.ClusterUuid}");
            _output.WriteLine($"ES±êÓ{response.Tagline}");
            _output.WriteLine($"°æ±¾ºÅ£º{response.Version.Number}");
            _output.WriteLine($"¹¹½¨·ç¸ñ£º{response.Version.BuildFlavor}");
            _output.WriteLine($"¹¹½¨ÀàÐÍ£º{response.Version.BuildType}");
            _output.WriteLine($"¹¹½¨¹þÏ££º{response.Version.BuildHash}");
            _output.WriteLine($"¹¹½¨ÈÕÆÚ£º{response.Version.BuildDate}");
            _output.WriteLine($"Éú³É¿ìÕÕ£º{response.Version.BuildSnapshot}");
            _output.WriteLine($"Lucene°æ±¾£º{response.Version.LuceneVersion}");
            _output.WriteLine($"×îµÍ¼æÈÝÐÔ°æ±¾£º{response.Version.MinimumWireCompatibilityVersion}");
            _output.WriteLine($"×îСË÷Òý¼æÈÝÐÔ°æ±¾ £º{response.Version.MinimumIndexCompatibilityVersion}");
            _output.WriteLine($"´íÎóÐÅÏ¢£º{response.ElasticsearchServerError}");
            _output.WriteLine($"¾¯¸æÐÅÏ¢£º{string.Join("", response.ElasticsearchWarnings)}");
        }

        /// <summary>
        /// ÏòstudentË÷Òý£¬Ìí¼ÓÎĵµ
        /// </summary>
        [Fact]
        public void AddDocument_Test()
        {
            var stu = new Student()
            {
                Name = "Test",
                Age =55,
                School = "Ì«¿µ¶þ¸ß",
                Grade = "ÎåÒ»°à",
                Address ="Ì«¿µÏØÏØÎ¯¼ÒÊôÂ¥xxx"
            };

            var request = new IndexRequest<Student>(document: stu,index: "student");

            var response = _client.Index(request);

            Assert.True(response.IsSuccess());

            
        }
    }
}