/**********************************************************************

  Audacity: A Digital Audio Editor

  HelpText.cpp

  James Crook

********************************************************************//**

\file HelpText.cpp
\brief Given a key, returns some html.
*//********************************************************************/


#include "HelpText.h"

#include <wx/colour.h>
#include <wx/string.h>
#include <wx/intl.h>
#include <wx/sstream.h>
#include <wx/txtstrm.h>

#include "FileNames.h"
#include "Internat.h"
#include "AllThemeResources.h"
#include "Theme.h"

#ifdef HAS_WHATS_NEW

namespace
{
const char* WhatsNewURL = "https://audacityteam.org/3.1.0-video";
}

#endif

wxString HtmlColourOfIndex( int i ){
   wxColour c =  theTheme.Colour(i);
   return wxString::Format("\"#%02X%02X%02X\"",
      c.Red(), c.Green(), c.Blue() );
}

static wxString WrapText( const wxString & Text )
{
   return wxString(wxT(""))+
      wxT("<html><head></head>") +
      wxT("<body bgcolor=") + HtmlColourOfIndex(clrTrackInfo) + wxT(">") +
      wxT("<font color=") + HtmlColourOfIndex(clrTrackPanelText) + wxT(">") +
      wxT("<p>") + Text +
      wxT("</font>")+
      wxT("</body></html>");
}

static wxString InnerLink( const wxString &Key, const wxString& Text )
{
   return wxString(wxT("")) +
      wxT("<a href='innerlink:") +
      Key +
      wxT("'>") +
      Text +
      wxT("</a>");
}

static wxString WikiLink( const wxString &Key, const wxString& Text )
{
   return wxString(wxT("")) +
      wxT("<a href='https://www.audacityteam.org/wiki/index.php?title=") +
      Key +
      wxT("'>") +
      Text +
      wxT("</a>");
}

static wxString FileLink( const wxString &Key, const wxString& Text )
{
   return wxString(wxT("")) +
      wxT("<a href='") +
      wxT("file:") +
      FileNames::HtmlHelpDir() +
      Key +
      wxT("'>") +
      Text +
      wxT("</a>");
}

static wxString TypedLink( const wxString &Key, const wxString& Text )
{
   return wxString(wxT("")) +
      wxT("<a href='") +
      Key +
      wxT("'>") +
      Text +
      wxT("</a>");
}

static wxString LinkExpand( const wxString & Text )
{
   wxString Temp = Text;
   int i,j,k;
   while( (i=Temp.First( wxT("[[") ))!= wxNOT_FOUND )
   {
      wxString Key = Temp.Mid(i+2);
      j = Key.First( wxT("|") );
      if( j==wxNOT_FOUND )
         return Temp;
      wxString LinkText = Key.Mid( j+1);
      k = LinkText.First( wxT("]]") );
      if( k==wxNOT_FOUND )
         return Temp;
      Key = Key.Mid( 0, j );
      LinkText = LinkText.Mid( 0, k );

      LinkText=wxString("<font color=") + HtmlColourOfIndex(clrSample) + wxT(">") +LinkText+"</font>";
      wxString Replacement;
      if( Key.StartsWith( wxT("wiki:") ))
      {
         Replacement = WikiLink( Key.Mid( 5 ), LinkText );
      }
      else if( Key.StartsWith( wxT("file:") ))
      {
         Replacement = FileLink( Key.Mid( 5 ), LinkText );
      }
      else if( Key.StartsWith( wxT("http:") ))
      {
         Replacement = TypedLink( Key, LinkText );
      }
      else if( Key.StartsWith( wxT("https:") ))
      {
         Replacement = TypedLink( Key, LinkText );
      }
      else if( Key.StartsWith( wxT("mailto:") ))
      {
         Replacement = TypedLink( Key, LinkText );
      }
      else if( Key.StartsWith( wxT("*URL*") ))
      {
         Replacement = TypedLink( Key, LinkText );
      }
      else
      {
         Replacement = InnerLink( Key, LinkText );
      }


      Temp = Temp.Mid( 0, i ) + Replacement + Temp.Mid( i + j + k + 5 );// 5 for the [[|]]
   }
   return Temp;
}

TranslatableString TitleText( const wxString & Key )
{
   if(Key==wxT("welcome"))
   {
      return XO("Welcome!");
   }

   if(Key ==wxT("play") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Playing Audio");
   }
   if((Key ==wxT("record") ) || (Key ==wxT("norecord") ))
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Recording Audio");
   }
   if(Key ==wxT("inputdevice") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Recording - Choosing the Recording Device");
   }
   if(Key ==wxT("inputsource") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Recording - Choosing the Recording Source");
   }
   if(Key ==wxT("inputlevel") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Recording - Setting the Recording Level");
   }
   if((Key ==wxT("edit") ) || (Key==wxT("grey")))
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Editing and greyed out Menus");
   }
   if(Key ==wxT("export") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Exporting an Audio File");
   }
   if(Key ==wxT("save") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Saving an Audacity Project");
   }
   if(Key ==wxT("wma-proprietary") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Support for Other Formats");
   }
   if(Key ==wxT("burncd") )
   {
      /* i18n-hint: Title for a topic.*/
      return XO("Burn to CD" );
   }
   if(Key ==  wxT("remotehelp") )
   {
      return XO("No Local Help");
   }
   // Uh oh, no translation...
   return Verbatim( Key );
}

static wxString HelpTextBuiltIn( const wxString & Key )
{
   // PRL:  Is it necessary to define these outside of conditional compilation so that both get into the .pot file?
   const auto alphamsg = XO(
"<br><br>The version of Audacity you are using is an <b>Alpha test version</b>.");
   const auto betamsg = XO(
"<br><br>The version of Audacity you are using is a <b>Beta test version</b>.");

   if (Key == wxT("welcome"))
   {
      wxStringOutputStream o;
      wxTextOutputStream s(o);
      s
#if defined(IS_ALPHA) || defined(IS_BETA)
         << wxT("<hr><center><h3>")
         << XO("Get the Official Released Version of Audacity")
         << wxT("</h3></center>")
         << VerCheckHtml()
#ifdef IS_ALPHA
         << alphamsg
#else
         << betamsg
#endif
         << wxT(" ")
         << XO(
"We strongly recommend that you use our latest stable released version, which has full documentation and support.<br><br>")
         << XO(
"You can help us get Audacity ready for release by joining our [[https://www.audacityteam.org/community/|community]].<hr><br><br>")
#endif

// DA: Support methods text.
#ifdef EXPERIMENTAL_DA
         // Deliberately not translated.
         << wxT("<center><h3>DarkAudacity ")
         << AUDACITY_VERSION_STRING
         << wxT("</h3></center>")
         << wxT("<br><br>DarkAudacity is based on Audacity:")
         << wxT("<ul><li>")
         << wxT(" [[http://www.darkaudacity.com|www.darkaudacity.com]] - for differences between them.")
         << wxT("</li><li>")
         << wxT(
" email to [[mailto:james@audacityteam.org|james@audacityteam.org]] - for help using DarkAudacity.")
         << wxT("</li><li>")
         << wxT(
" [[http://www.darkaudacity.com/video.html|Tutorials]] - for getting started with DarkAudacity.")
         << wxT("</li></ul>")
         << wxT("<br><br>Audacity has these support methods:")
         << wxT("<ul><li>")
         << wxT(" [[https://manual.audacityteam.org/|Manual]] - for comprehensive Audacity documentation")
         << wxT("</li><li>")
         << wxT(" [[https://forum.audacityteam.org/|Forum]] - for large knowledge base on using Audacity.")
         << wxT("</li></ul>")
#else
         << wxT("<center><h3>")
#ifndef HAS_WHATS_NEW
         << wxT("Audacity ") << AUDACITY_VERSION_STRING
#else
         /* i18n-hint: %s is replaced with Audacity version */
         << XO("What's new in Audacity %s").Format(AUDACITY_VERSION_STRING)
         << wxT(R"(<p><a href=")") << WhatsNewURL << wxT(R"(">)")
         << wxT(R"(<img src="memory:whats_new_btn.png" width="263" height="148" /></a></p>)")
#endif
         << wxT("</h3><h3>")
         << XO("How to get help")
         << wxT("</h3></center>")
         << XO("These are our support methods:")
         << wxT("<p><ul><li>")
         /* i18n-hint: Preserve '[[help:Quick_Help|' as it's the name of a link.*/
         << XO("[[help:Quick_Help|Quick Help]] - if not installed locally, [[https://manual.audacityteam.org/quick_help.html|view online]]")
         << wxT("</li><li>")
         << XO(
/* i18n-hint: Preserve '[[help:Main_Page|' as it's the name of a link.*/
" [[help:Main_Page|Manual]] - if not installed locally, [[https://manual.audacityteam.org/|view online]]")
         << wxT("</li><li>")
         << XO(
" [[https://forum.audacityteam.org/|Forum]] - ask your question directly, online.")
         << wxT("</li></ul></p><p>")
         << wxT("<b>")
         << XO("More:</b> Visit our [[https://wiki.audacityteam.org/index.php|Wiki]] for tips, tricks, extra tutorials and effects plug-ins.")
         << wxT("</p>")
#endif
   ;

      auto result = o.GetString();
#ifdef USE_ALPHA_MANUAL
      result.Replace( "//manual.audacityteam.org/quick_help.html","//alphamanual.audacityteam.org/man/Quick_Help" );
      result.Replace( "//manual.audacityteam.org/","//alphamanual.audacityteam.org/man/" );
#endif

      return WrapText( result );
   }
   if(Key==wxT("wma-proprietary"))
   {
      wxStringOutputStream o;
      wxTextOutputStream s(o);
      s
         << wxT("<p>")
         << XO(
"Audacity can import unprotected files in many other formats (such as M4A and WMA, \
compressed WAV files from portable recorders and audio from video files) if you download and install \
the optional [[https://manual.audacityteam.org/man/faq_opening_and_saving_files.html#foreign| \
FFmpeg library]] to your computer.")
         << wxT("</p><p>")
         <<  XO(
"You can also read our help on importing \
[[https://manual.audacityteam.org/man/playing_and_recording.html#midi|MIDI files]] \
and tracks from [[https://manual.audacityteam.org/man/faq_opening_and_saving_files.html#fromcd| \
audio CDs]].")
         << wxT("</p>")
      ;
      return WrapText( o.GetString() );
   }

   // Remote help allows us to link to a local copy of the help if it exists,
   // or provide a message that takes you to the Internet if it does not.
   // It's used by the menu item Help > Index
   if(Key ==  wxT("remotehelp") )
   {
      wxStringOutputStream o;
      wxTextOutputStream s(o);
      s
// *URL* will be replaced by whatever URL we are looking for.
// DA: View the manual on line is expected.
#ifdef EXPERIMENTAL_DA
         << XO(
"The Manual does not appear to be installed. \
Please [[*URL*|view the Manual online]].<br><br>\
To always view the Manual online, change \"Location of Manual\" in \
Interface Preferences to \"From Internet\".")
#else
         << XO(
"The Manual does not appear to be installed. \
Please [[*URL*|view the Manual online]] or \
[[https://manual.audacityteam.org/man/unzipping_the_manual.html| \
download the Manual]].<br><br>\
To always view the Manual online, change \"Location of Manual\" in \
Interface Preferences to \"From Internet\".")
#endif
      ;
      return WrapText( o.GetString() );
   }
   return {};
}

wxString HelpText( const wxString & Key )
{

   // Possible future enhancement...
   // We could look for the text as a local file and use
   // that if we find it...
   // if( wxFileExists( Path+Key ) )
   // ...

   wxString Text;
   Text = HelpTextBuiltIn( Key );

   if( !Text.empty())
      return LinkExpand( Text );

   // Perhaps useful for debugging - we'll return key that we didn't find.
   return WrapText( Key );
}


wxString FormatHtmlText( const wxString & Text ){

   wxString localeStr = wxLocale::GetSystemEncodingName();

   return 
      wxT("<html><head><META http-equiv=\"Content-Type\" content=\"text/html; charset=") +
      localeStr +
      wxT("\"></head>") +
      WrapText( LinkExpand( Text ))+
      wxT("</html>");
}

// Function to give the extra arguments to put on the version check string.
const wxString VerCheckArgs(){
   wxString result = wxString("from_ver=") + AUDACITY_VERSION_STRING;
#ifdef REV_LONG
   result += wxString("&CommitId=")+wxString(REV_LONG).Left(6);
#endif
   result += wxString("&Time=") + wxString( __DATE__ ) + wxString( __TIME__ );
   result.Replace(" ","");
   return result;
}

// Text of hyperlink to check versions.
const wxString VerCheckHtml()
{
   wxStringOutputStream o;
   wxTextOutputStream s(o);
   s
      << "<center>[["
      << VerCheckUrl().GET()
      << "|"
      << XO("Check Online")
      << "]]</center>\n";
   return o.GetString();
}

// Url with Version check args attached.
const URLString VerCheckUrl()
{
   //The version we intend to use for live Audacity.
#define VER_CHECK_URL "https://www.audacityteam.org/download/?"
//For testing of our scriptlet.
//#define VER_CHECK_URL "http://www.audacityteam.org/slug/?"
//For testing locally
//#define VER_CHECK_URL "http://localhost:63342/WorkingDocs/demos/download.html?"

   return wxString( wxT(VER_CHECK_URL)) +VerCheckArgs();
}
