/////////////////////////////////////////////////////////////////////////////////
//
// This file is part of SACAMOS, cable models for EMI simulations in SPICE.
// It was developed by the University of Nottingham and the Netherlands Aerospace
// Centre (NLR) for ESA under contract number 4000112765/14/NL/HK.
//
// Copyright (C) 2015 - 2018 University of Nottingham
//
// SACAMOS is free software: you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// SACAMOS is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.
//
// A copy of the GNU General Public License version 3 can be found in the
// file GNU_GPL_v3 in the root or at <http://www.gnu.org/licenses/>.
//
// wxWidgets is currently licenced under the "wxWindows Library Licence".
// A copy of the wxWindows Library Licence, Version 3.1 can be found in the file
// wxWindows_Library_Licence_v3-1 in the root or at:
// <https://www.wxwidgets.org/about/licence/>
//
//
// The University of Nottingham can be contacted at: ggiemr@nottingham.ac.uk
//
// File Contents:
//
// NAME
//     SW1_GUIApp.cpp
//
// DESCRIPTIONbre
//     Main application GUI for SACAMOS
//
// AUTHOR(S)
//     Steve Greedy
//
/////////////////////////////////////////////////////////////////////////////////

#include "SW1_GUIApp.h"

//(*AppHeaders
#include "SW1_GUIMain.h"
#include <wx/image.h>
//*)

IMPLEMENT_APP(SW1_GUIApp);

bool SW1_GUIApp::OnInit()
{

    wxTextFile BuildFile;

    wxString systeminfo, buildtext, guiversion, cmdversion;

    wxDateTime DateToday = wxDateTime::Now();

    wxString   str = DateToday.Format(wxT("%d-%m-%y"), wxDateTime::Local );

    string Date = str.ToStdString();

    string updatemessage;

    Logger::instance().log(Date, Logger::kLogLevelHeader);
    Logger::instance().log("", Logger::kLogLevelHeader);
    Logger::instance().log("SACAMOS STARTED", Logger::kLogLevelHeader);
    Logger::instance().log("===============", Logger::kLogLevelHeader);

    Logger::instance().log("Host Information:", Logger::kLogLevelHeader);
    Logger::instance().log("", Logger::kLogLevelHeader);

    systeminfo = wxGetHostName();
    Logger::instance().log(systeminfo.ToStdString(), Logger::kLogLevelHeader);

    systeminfo =  wxPlatformInfo::Get().GetOperatingSystemDescription();
    Logger::instance().log(systeminfo.ToStdString(), Logger::kLogLevelHeader);

    Logger::instance().log("", Logger::kLogLevelHeader);
    Logger::instance().log("SACAMOS Build:", Logger::kLogLevelHeader);

    if (BuildFile.Open("resources/Build"))
    {
        for (int i = 0; i<8; i++)
        {
            buildtext = BuildFile[i];

            if (i==1) guiversion = BuildFile[i];

            if (i==5) cmdversion = BuildFile[i];

            Logger::instance().log(buildtext.ToStdString(), Logger::kLogLevelHeader);
        }
    }

    BuildFile.Close();

    wxString os_version = wxGetOsDescription();

    wxStringTokenizer tokenizer(os_version, " ");

    wxString os_type = tokenizer.GetNextToken();

    //(*AppInitialize
    bool wxsOK = true;
    wxInitAllImageHandlers();


    if ( wxsOK )
    {
        // Display splash screen

        if (splashimage.LoadFile("resources/Sacamos_About.png", wxBITMAP_TYPE_PNG))
        {
            wxSplashScreen *splashscrn = new wxSplashScreen(splashimage,
            wxSPLASH_CENTRE_ON_SCREEN|wxSPLASH_TIMEOUT,
            2000, NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize,
            wxSIMPLE_BORDER|wxSTAY_ON_TOP);
        }

        if (os_type=="Windows")
        {
            wxYield();
            wxSleep(2);
            //Frame->Show(true);
        }
        else
        {
            for (int i=0;i<20;i++)
            {
                wxYield();
                wxMilliSleep(10);
            }
        }

    }
    //*)

    // Compare current version against latest release version
    Logger::instance().log("Checking for Software Update...", Logger::kLogLevelInfo);

    std::string latest_version,latest_version_number, latest_version_date;
    std::string current_version,current_version_number, current_version_date;

    wxString version_temp = "";

    wxStringOutputStream out_stream(&version_temp);

    wxHTTP checkupdate;
    checkupdate.SetHeader(_T("Content-type"), _T("text/html; charset=utf-8"));
    checkupdate.SetTimeout(5);
    checkupdate.Connect(_T("128.243.70.77"));

    wxApp::IsMainLoopRunning();

    wxInputStream *latest_versioninfo;

    latest_versioninfo = checkupdate.GetInputStream(_T("/UoN/SACAMOS/raw/master/version_information.inc"));

    if (checkupdate.GetError() == wxPROTO_NOERR)
    {
        Logger::instance().log("Connected to SACAMOS Repository", Logger::kLogLevelInfo);

        latest_versioninfo->Read(out_stream);

        latest_version = version_temp.ToStdString();
    }

    else
    {
        //fail silently & log event
        Logger::instance().log("Could not connect to SACAMOS Repository", Logger::kLogLevelInfo);
    }

    wxDELETE(latest_versioninfo);

    checkupdate.Close();

    if (wxsOK)
    {
        SW1_GUIFrame* Frame = new SW1_GUIFrame(0);
        Frame->Show(true);
    }

    std::istringstream stream{latest_version};

    if (latest_version != "")
    {
        std::getline(stream, latest_version_number);

        if (latest_version_number != SACAMOS_V_NUMBER)
        {
            size_t pos;

            string latest_version_number_trimmed;
            pos = latest_version_number.find("=");
            latest_version_number_trimmed = latest_version_number.substr(pos+2);
            latest_version_number_trimmed = latest_version_number_trimmed.substr(0,latest_version_number_trimmed.size()-1);

            string current_version_number_trimmed;
            pos = SACAMOS_V_NUMBER.find("=");
            current_version_number_trimmed = SACAMOS_V_NUMBER.substr(pos+2);
            current_version_number_trimmed = current_version_number_trimmed.substr(0,latest_version_number_trimmed.size());

            updatemessage = "You are running SACAMOS " + current_version_number_trimmed + "\n\n";
            updatemessage+= "The latest version is  " + latest_version_number_trimmed + "\n\n";
            updatemessage+= "Please visit www.sacamos.org to download the latest version.";

            wxString myString(updatemessage);
            wxMessageBox(updatemessage,"Please Update");

            Logger::instance().log("SACAMOS Update Available", Logger::kLogLevelInfo);

        }
        else
        {
            Logger::instance().log("SACAMOS Uptodate", Logger::kLogLevelInfo);
        }
    }

    return wxsOK;

}
