using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Windows;
using ChatController.Klassen;
using Newtonsoft.Json;

namespace ChatController.HauptKlassen
{
    public class Login
    {
        private string _url = ""; //"https://bewoplaner.beyondsoft.de/voucher_check.php"; // alt

        private string _newUrl = "https://dict.ownchat.de/api/server/resolve/1/"; //https://dict.ownchat.de/api/server/resolve/{type}/{customerid}  //type = Diensttyp(1,2,oder 3), customerid  = Kudennummer des Kunden

        private string _serverUrl = "";
        private string _authToken = "";

        private readonly string _benutzername;
        private readonly string _passwort;
        private readonly string _kundennummer;
        private readonly string _chatCode;
        private readonly string _apikey;

        private long? _userid;

        private bool _verbindungsaufbauOK = false;
        private bool _ownchatVerbindungsaufbauOK = false;
        private bool _gruppeholenverbindungsaufbauOK = false;

        private AuthentifizierungsDaten _serverconect;
        private UserDaten _userconect;
        private ChatGruppenDaten _groupconect;

        public Login(string kundennummer, string chatCode,string benutzername,string passwort)
        {
            _kundennummer = kundennummer;
            _chatCode = chatCode;
            _benutzername = benutzername;
            _passwort = passwort;
            _apikey = "0000";//default damit nichts kaput geht 
        }
        public Login(string kundennummer, string chatCode, string benutzername, string passwort,string apikey)
        {
            _kundennummer = kundennummer;
            _chatCode = chatCode;
            _benutzername = benutzername;
            _passwort = passwort;
            _apikey = apikey;
        }

        public ChatDatenUebergabe AnmeldevorgangDurchFuehren()
        {
           if(ServerErmittlung()){
                Dictionary<string, string> dic = new Dictionary<string, string>();

                dic.Add("username", _benutzername);
                dic.Add("password", _passwort);
                dic.Add("chatcode",_chatCode);

                VerbindeMitChatServer(dic);
         

                // Gruppen abfragen          
                if (_ownchatVerbindungsaufbauOK)
                {
                    GruppenHolen();
                }


                if (_gruppeholenverbindungsaufbauOK)
                {
                
                    ChatDatenUebergabe ubergabe = new ChatDatenUebergabe(_serverconect, _userconect, _groupconect, _serverUrl, _authToken, _userid, _kundennummer,_apikey);

                    return ubergabe;
                }
            }
            return null;
        }
        
        public bool ServerErmittlung()
        {
            try
            {
                string serverURl = _newUrl + _kundennummer;

                WebRequest request = WebRequest.Create(serverURl);

                request.Credentials = CredentialCache.DefaultCredentials;

                WebResponse response;

                try
                {
                    response = request.GetResponse();
                }
                catch (Exception e)
                {
                     MessageBox.Show("Es konnte keine Verbindung aufgebaut werden.", "Fehler", MessageBoxButton.OK);
                    return false;
                }

                // Display the status.
                var statusResponse = ((HttpWebResponse)response).StatusDescription;
                
                string responseFromServer = ReadStream(response);

                try
                    {
                        var jsonDatentyp = JsonConvert.DeserializeObject<NewAuthentifizierungsDatenTyp1>(responseFromServer);

                        if (jsonDatentyp.Status == 1)
                        {
                            MessageBox.Show("Kundennummer unbekannt");
                            return false;
                        }
                        else if (jsonDatentyp.Status == 2)
                        {
                            MessageBox.Show("Diensttyp ist für angegebene Kundennummer nicht definiert");
                            return false;
                        }
                        else
                        { 
                            _url = jsonDatentyp.URL;
                        }
                    }
                    catch (Exception eds)
                    {
                        try
                        {
                            var jsonDatentyp = JsonConvert.DeserializeObject<NewAuthentifizierungsDatenTyp2>(responseFromServer);

                            if (jsonDatentyp.Status == 1)
                            {
                                MessageBox.Show("Kundennummer unbekannt");
                                return false;
                            }
                            else if (jsonDatentyp.Status == 2)
                            {
                                MessageBox.Show("Diensttyp ist für angegebene Kundennummer nicht definiert");
                                return false;
                            }
                            else
                            { 
                                _url = jsonDatentyp.URL;
                            }
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show("Beim Parsen der Datei ist ein fehler aufgetreten.", "Fehler",
                                MessageBoxButton.OK);
                        }
                    }
              
                response.Close();

                _serverUrl = _url;
                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show("Ein nicht weiter definierter fehler ist aufgetreten: "+ e.Message,"Fehler",MessageBoxButton.OK);
                return false;
            }
        }

        private void VerbindeMitChatServer(Dictionary<string, string> postparameter)
        {
            try
            {
                var endurl = _url + "/api/user/login"; //loginwithchatcode

                string postdaten = "";

                int i = 0;
                foreach (var key in postparameter.Keys)
                {
                    postdaten += HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(postparameter[key]) + "&";
                }

                WebRequest requesten = WebRequest.Create(endurl);

                requesten.Method = "POST";
                requesten.ContentType = "application/x-www-form-urlencoded";
                requesten.Headers["CustomerID"] = _kundennummer;

                byte[] daten = Encoding.ASCII.GetBytes(postdaten);

                requesten.ContentLength = daten.Length;

                Stream requestStream = requesten.GetRequestStream();

                requestStream.Write(daten, 0, daten.Length);

                requestStream.Close();

                HttpWebResponse myHttpWebResponse = (HttpWebResponse)requesten.GetResponse();

                Stream responseStream = myHttpWebResponse.GetResponseStream();

                StreamReader myStreamReader = new StreamReader(responseStream, Encoding.Default);

                string pageContent = myStreamReader.ReadToEnd();

                
                //UserDaten müssen mehrere wege der initialisierung bieten 
                if (!pageContent.Equals(""))
                {
                    //_serverCheckOK = true;

                    //string[] array = responseFromServer.Split(':');

                    //Json Verarbeitungsgedöns  Dictionary < string, TestKlasse>
                    var jsonDaten = JsonConvert.DeserializeObject<UserDaten>(pageContent);

                    //var serv = jsonDaten[_chatcode].ServerName;

                    foreach (var datev in jsonDaten.Response)
                    {
                        _authToken = datev.Value.Token;
                        _userid = datev.Value.Oid;
                    }

                    _userconect = jsonDaten;

                    _ownchatVerbindungsaufbauOK = true;
                }
                else
                {
                    //throw fehler
                   // MessageBox.Show("Keine Daten Vorhanden.");
                }


                // MessageBox.Show(pageContent);

                myStreamReader.Close();
                responseStream.Close();

                }
                catch (Exception e)
                {
                    //throw fehler
                    MessageBox.Show(e.Message, "Fehler", MessageBoxButton.OK);
                }
        }

        private void GruppenHolen()
        {
            try
            {
                var endurl = _url + "/api/chat/groups";

                WebRequest request = WebRequest.Create(endurl);

                request.Credentials = CredentialCache.DefaultCredentials;
                request.Headers["Token"] = _authToken;
                request.Headers["CustomerID"] = _kundennummer;

                // Get the response.
                WebResponse response = request.GetResponse();

                // Display the status.
                var statusResponse = ((HttpWebResponse)response).StatusDescription;


                string responseFromServer = ReadStream(response);

                //verarbeite hier zu json
                if (!responseFromServer.Equals(""))
                {
                    //################# Deserialisierung mit Json ###############################
                    var jsonDaten = JsonConvert.DeserializeObject<ChatGruppenDaten>(responseFromServer);

                    _groupconect = jsonDaten;
                    // var serv = jsonDaten[_chatcode].ServerName;

                    //MessageBox.Show(responseFromServer);
                    _gruppeholenverbindungsaufbauOK = true;
                }
                else
                {
                   // MessageBox.Show("Keine Daten Vorhanden.");
                }

                response.Close();
            }
            catch (Exception e)
            {
               // MessageBox.Show(e.Message, "Fehler", MessageBoxButton.OK);
            }

        }

        private string ReadStream(WebResponse response)
        {
            try
            {
                Stream dataStream = response.GetResponseStream();

                StreamReader reader = new StreamReader(dataStream);

                string responseFromServer = reader.ReadToEnd();


                dataStream.Dispose();
                reader.Dispose();

                dataStream.Close();
                reader.Close();

                return responseFromServer;
            }
            catch (Exception e)
            {
              //  MessageBox.Show(e.Message);
                return null;
            }
        }

    }
}
