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

        public 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 _angemeldeterUser;
        private ChatGruppenDaten _alleGruppen;

        private bool showMessageBox = true;

        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 Login(string kundennummer)
        {
            _kundennummer = kundennummer;
            showMessageBox = false;
            ServerErmittlung();
        }

        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);
                
                if (_ownchatVerbindungsaufbauOK)
                {
                    GruppenHolen();
                }


                if (_gruppeholenverbindungsaufbauOK)
                {

                    long maxUploadSize = GetMaiximumAllowedFileUploadSize(_authToken,_kundennummer);

                    ChatDatenUebergabe ubergabe = new ChatDatenUebergabe(_serverconect, _angemeldeterUser, _alleGruppen, _serverUrl, _authToken, _userid, _kundennummer,_apikey, maxUploadSize);

                    return ubergabe;
                }
            }
            return null;
        }
        
        public bool ServerErmittlung()
        {
            if (_serverUrl.Equals(""))
            {
                try
                {

                    string serverURl = _newUrl + _kundennummer;

                    WebRequest request = WebRequest.Create(serverURl);

                    request.Credentials = CredentialCache.DefaultCredentials;

                    WebResponse response;

                    try
                    {
                        response = request.GetResponse();
                    }
                    catch (Exception e)
                    {
                        if (showMessageBox)
                        {
                            MessageBox.Show("Fehler: Es konnte keine Verbindung aufgebaut werden.", "ownChat Fehler",
                                MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                        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)
                        {
                            if (showMessageBox)
                            {
                                MessageBox.Show(
                                    "Fehler: Kundennummer unbekannt.\nBitte überprüfen Sie die Anmeldeinformationen.",
                                    "ownChat Info", MessageBoxButton.OK, MessageBoxImage.Asterisk);
                            }
                            return false;
                        }
                        else if (jsonDatentyp.Status == 2)
                        {
                            if (showMessageBox)
                            {
                                MessageBox.Show("Der Diensttyp ist für die angegebene Kundennummer nicht definiert.",
                                    "ownChat Info",
                                    MessageBoxButton.OK, MessageBoxImage.Asterisk);
                            }
                            return false;
                        }
                        else
                        {
                            _url = jsonDatentyp.URL;
                        }
                    }
                    catch (Exception eds)
                    {
                        try
                        {
                            var jsonDatentyp =
                                JsonConvert.DeserializeObject<NewAuthentifizierungsDatenTyp2>(responseFromServer);

                            if (jsonDatentyp.Status == 1)
                            {
                                if (showMessageBox)
                                {
                                    MessageBox.Show(
                                        "Fehler: Kundennummer unbekannt.\nBitte überprüfen Sie die Anmeldeinformationen.",
                                        "ownChat Info", MessageBoxButton.OK, MessageBoxImage.Asterisk);
                                }
                                return false;
                            }
                            else if (jsonDatentyp.Status == 2)
                            {
                                if (showMessageBox)
                                {
                                    MessageBox.Show(
                                        "Der Diensttyp ist für die angegebene Kundennummer nicht definiert.",
                                        "ownChat Info", MessageBoxButton.OK, MessageBoxImage.Asterisk);
                                }
                                return false;
                            }
                            else
                            {
                                _url = jsonDatentyp.URL;
                            }
                        }
                        catch (Exception e)
                        {
                            if (showMessageBox)
                            {
                                MessageBox.Show("Fehler: " + e.Message, "ownChat Fehler", MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                            }

                        }
                    }

                    response.Close();

                    _serverUrl = _url;
                    return true;
                }
                catch (Exception e)
                {
                    if (showMessageBox)
                    {
                        MessageBox.Show("Fehler: " + e.Message, "ownChat Fehler", MessageBoxButton.OK,
                            MessageBoxImage.Error);
                    }
                    return false;
                }
            }
            else
            {
                return true;
            }
        }

        private void VerbindeMitChatServer(Dictionary<string, string> postparameter)
        {
            string fehlermeldung = "";
            try
            {
                var endurl = _url + "/api/user/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();

                if (!pageContent.Equals(""))
                {
                    var jsonDaten = JsonConvert.DeserializeObject<UserDaten>(pageContent);

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

                        _angemeldeterUser = jsonDaten;

                        _ownchatVerbindungsaufbauOK = true;
                    }
                    else
                    {
                        if (jsonDaten.Errors.chatcode_failed != null)
                        {
                            if (showMessageBox)
                            {
                                MessageBox.Show(
                                    "Fehler: " + jsonDaten.Errors.chatcode_failed[0] +
                                    "\nBitte überprüfen Sie die Anmeldeinformationen.", "Info", MessageBoxButton.OK,
                                    MessageBoxImage.Asterisk);
                            }
                        }else if (jsonDaten.Errors.login_failed != null)
                        {
                            if (showMessageBox)
                            {
                                MessageBox.Show(
                                    "Fehler: " + jsonDaten.Errors.login_failed[0] +
                                    "\nBitte überprüfen Sie die Anmeldeinformationen.", "Info", MessageBoxButton.OK,
                                    MessageBoxImage.Asterisk);
                            }
                        }
                        
                        _ownchatVerbindungsaufbauOK = false;
                    }
                }
                
                myStreamReader.Close();
                responseStream.Close();

                }
                catch (Exception e)
                {
                    if (showMessageBox)
                    {
                        MessageBox.Show("Fehler:" + e.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
        }

        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;

                using (WebResponse response = request.GetResponse())
                {

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

                    string responseFromServer = ReadStream(response);

                    if (!responseFromServer.Equals(""))
                    {
                        var jsonDaten = JsonConvert.DeserializeObject<ChatGruppenDaten>(responseFromServer);

                        _alleGruppen = jsonDaten;

                        _gruppeholenverbindungsaufbauOK = true;
                    }

                }
            }
            catch (Exception e)
            {
                if (showMessageBox)
                {
                    MessageBox.Show("Fehler: " + e.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }

        }

        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;
            }
        }

        #region Maximal erlaubte File Größe

        public long GetMaiximumAllowedFileUploadSize(string token, string customerid)
        {
            long maxsize = 0;
            try
            {
                var endurl = _serverUrl + "/api/ownchat/uploadmaxsize";// + apikey + "/" + customerid;

                WebRequest request = WebRequest.Create(endurl);
                request.Headers["Token"] = token; 
                request.Headers["CustomerID"] = customerid;

                request.Credentials = CredentialCache.DefaultCredentials;
                request.Proxy = null;

                using (WebResponse response = request.GetResponse())
                {

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

                    string responseFromServer = ReadStream(response);

                    var definiti = new {file_upload_max_size = ""};

                    var jsonDatentyp = JsonConvert.DeserializeAnonymousType(responseFromServer, definiti);
                    maxsize = Convert.ToInt64(jsonDatentyp.file_upload_max_size);

                }
                
            }
            catch (Exception e)
            {
                return 0;
            }

            return maxsize;
        }
        
        #endregion

    }
}
