using Message.MessageTypes;
using RequestService.ServiceController;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using MassTransit.Util;
using LAPS_WATCHER.App_Data;
using MassTransit;
using LAPS_WATCHER.Configure;
using Microsoft.Extensions.Configuration;
using RequestService;

namespace LAPS_WATCHER.Messaging
{
    public class RabbitMq
    {
        CommonRepository repository = new CommonRepository();
        public bool SendMq(string Tranid, string UserId, string AppType, string StageType, string Enviroment)
        {
            string ServiceAddress = Global.RabbitMQHost + "" + "/" + Global.ServiceQueueName;
            var message = new PublishMessage(DateTime.Now.ToString(), Tranid, UserId, AppType, StageType, Enviroment, null, "");
            RabbitMq MqRef = new RabbitMq();
            var task = MqRef.Publish(message, ServiceAddress);
            if (task.Result != true)
            {
                return false;
            }
            return true;           
        }

        public bool SendMqMail(string Tranid, string JobWorkflowid, string flag, string curtranid, string userid)
        {
            string ServiceAddress = Global.RabbitMQHost + "" + "/" + CustomConfiguration.AppSettings.GetValue<string>("AppSettings:mailqueue");  
            DynamicParams dynamicparams = new DynamicParams()
            {
                jobworkflowid = JobWorkflowid,
                nexttranid = curtranid
            };
            List<DynamicParams> dynamicparams_ = new List<DynamicParams>();
            dynamicparams_.Add(dynamicparams);
            var message = new PublishMessage(DateTime.Now.ToString(), Tranid, userid, "", "", Global.Enviroinment, dynamicparams, flag);
            var task = Publish(message, ServiceAddress);
            if (task.Result != true)
            {
                return false;
            }
            return true;            
       }
        public IBusControl CreateBus(string RabbitMQHost, string userName, string password)
        {
            return Bus.Factory.CreateUsingRabbitMq(x => x.Host(new Uri(RabbitMQHost), h =>
            {
                h.Username(userName);
                h.Password(password);
            }));
        }

        static void ConfigureLogger()
        {
            const string logConfig = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<log4net>
  <root>
    <level value=""INFO"" />
    <appender-ref ref=""console"" />
  </root>
  <appender name=""console"" type=""log4net.Appender.ColoredConsoleAppender"">
    <layout type=""log4net.Layout.PatternLayout"">
      <conversionPattern value=""%m%n"" />
    </layout>
  </appender>
</log4net>";

            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(logConfig)))
            {
                // XmlConfigurator.Configure(stream);
            }
        }
       
	   
	   public async Task<bool> Publish(PublishMessage message, string SeriveAddress)
        {
           string ServiceAddress = CustomConfiguration.AppSettings.GetValue<string>("AppSettings:chechoutqueue_path") + "" + "/" + CustomConfiguration.AppSettings.GetValue<string>("AppSettings:chechoutqueue");
            string QueueName = CustomConfiguration.AppSettings.GetValue<string>("AppSettings:chechoutqueue");
            string RabbitMQHost = CustomConfiguration.AppSettings.GetValue<string>("AppSettings:chechoutqueue_path");
            
            string userName = "admin"; //obj.username;
            string password = "admin"; //obj.password;

            var _busControl = Bus.Factory.CreateUsingRabbitMq(x =>
            {
                var host = x.Host(new Uri(RabbitMQHost), h =>
                {
                    h.Username(userName);
                    h.Password(password);
                });
            });
            try
            {
                TaskUtil.Await(() => _busControl.StartAsync());
                Uri ServiceAddress_uri = new Uri(ServiceAddress);
                var endPoint = await _busControl.GetSendEndpoint(ServiceAddress_uri);
                await endPoint.Send(message);
                //await _busControl.Publish(message); 

            }
            catch (Exception ex)
            {
                //oCommonRepository.ErrorLog(ex);
                return false;
            }
            finally
            {

                _busControl.Stop();
            }
            return true;
        }
    }

 //   class SimpleRequest
 //: ISimpleRequest

 //   {
 //       //readonly string _customerId;
 //       //readonly string _TransId;
 //       //readonly string _UserId;
 //       //readonly string _AppType;
 //       //readonly string _StageType;
 //       //readonly string _Enviroment;
 //       //readonly DateTime _timestamp;
 //       //readonly object _DynamicList;
 //       //readonly string _Flag;

 //       //public SimpleRequest(string customerId, string Tranid, string UserId, string AppType, string StageType, string Enviroment, object DynamicList, string Flag)
 //       //{
 //       //    _customerId = customerId;
 //       //    _TransId = Tranid;
 //       //    _UserId = UserId;
 //       //    _AppType = AppType;
 //       //    _StageType = StageType;
 //       //    _Enviroment = Enviroment;
 //       //    _timestamp = DateTime.UtcNow;
 //       //    _DynamicList = DynamicList;
 //       //    _Flag = Flag;
 //       //}

 //       //public DateTime Timestamp
 //       //{
 //       //    get { return _timestamp; }
 //       //}
 //       //public string TransId
 //       //{
 //       //    get { return _TransId; }
 //       //}
 //       //public string CustomerId
 //       //{
 //       //    get { return _customerId; }
 //       //}
 //       //public string UserId
 //       //{
 //       //    get { return _UserId; }
 //       //}
 //       //public string AppType
 //       //{
 //       //    get { return _AppType; }
 //       //}
 //       //public string StageType
 //       //{
 //       //    get { return _StageType; }
 //       //}
 //       //public string Enviroment
 //       //{
 //       //    get { return _Enviroment; }
 //       //}
 //       //public object DynamicList
 //       //{
 //       //    get { return _DynamicList; }
 //       //}
 //       //public string Flag
 //       //{
 //       //    get { return _Flag; }
 //       //}
 //       //string ISimpleRequest.TransId
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //       //string ISimpleRequest.UserId
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //       //string ISimpleRequest.AppType
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //       //string ISimpleRequest.StageType
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //       //string ISimpleRequest.Enviroment
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //       //object ISimpleRequest.DynamicList
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //       //string ISimpleRequest.Flag
 //       //{
 //       //    get
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }

 //       //    set
 //       //    {
 //       //        throw new NotImplementedException();
 //       //    }
 //       //}

 //   }
    public class checkinprocess
    {
        public Int32? jobworkflowid { get; set; }
        public Int32? isexe { get; set; }
        public Int32? isservice { get; set; }
        public Int32? applicationserverid { get; set; }
        public string paramss { get; set; }
        public string ipaddress { get; set; }
        public string appname { get; set; }
        public string stagetype { get; set; }
        public string file_movement { get; set; }
        public string root_path { get; set; }
        public Int32? stageorder { get; set; }
        public string checkout_app { get; set; }
        public Int32? appid { get; set; }
        public string username { get; set; }
        public string password { get; set; }
    }


}
