using MonkeyCache.FileStore;
using Serilog;
using System;
using System.Threading.Tasks;
using TINK.Model.Repository.Exception;
using TINK.Model.Device;
using TINK.Model.State;
using TINK.Model.Station;
using TINK.Model.User;
using Xamarin.Forms;
using TINK.Model.Bikes.Bike.BC;
using TINK.Model.Repository;
using TINK.Repository.Exception;
using System.Net;
using TINK.MultilingualResources;
namespace TINK.ViewModel
{
public static class ViewModelHelper
{
/// First part of text making up a station name.
private const string USER_FIENDLY_STATIONNUMBER_PREFIX = "Station";
/// Holds the color which marks link to TINK- app pages, web sites, ...
public static Color LINK_COLOR = Color.Blue;
///
/// Gets station name from station object.
///
/// Station to get id from
///
public static string GetStationName(this IStation p_oStation)
{
if (p_oStation == null)
{
return string.Empty;
}
if (!string.IsNullOrEmpty(p_oStation.StationName))
{
return $"{p_oStation.StationName}, Nr. {p_oStation.Id}.";
}
return GetStationName(p_oStation.Id);
}
///
/// Gets station name from station object.
///
/// Station to get id from
///
public static string GetStationName(int p_iStationId)
{
return string.Format("{0} {1}", USER_FIENDLY_STATIONNUMBER_PREFIX, p_iStationId);
}
///
/// Gets station id from station name.
///
/// Station to get id from
///
public static int GetStationId(string p_strStationName)
{
return int.Parse(p_strStationName.Replace(USER_FIENDLY_STATIONNUMBER_PREFIX, "").Trim());
}
/// Get the display name of a bike.
/// bike to get name for.
/// Display name of bike.
public static string GetDisplayName(this IBikeInfoMutable bike)
{
var l_oId = bike.Id;
var l_oIsDemo = bike.IsDemo;
// Not known how many whells cargo bike has.
return $"{(!string.IsNullOrEmpty(bike.Description) ? $"{bike.Description}, " : string.Empty)}Nr. {l_oId}";
}
///
/// Maps state to color.
///
///
///
public static Color GetColor(this InUseStateEnum p_eState)
{
switch (p_eState)
{
case InUseStateEnum.Disposable:
return Color.Default;
case InUseStateEnum.Reserved:
return Color.Orange;
case InUseStateEnum.Booked:
return Color.Green;
default:
return Color.Default;
}
}
/// Gets message that logged in user has not booked any bikes.
public static string GetShortErrorInfoText(this Exception exception)
{
if (exception == null)
{
return string.Empty;
}
// An error occurred getting bikes information.
switch (exception)
{
case WebConnectFailureException:
return AppResources.ActivityTextErrorWebConnectFailureException;
case InvalidResponseException:
return AppResources.ActivityTextErrorInvalidResponseException;
case WebForbiddenException:
return AppResources.ActivityTextErrorWebForbiddenException;
case DeserializationException:
return AppResources.ActivityTextErrorDeserializationException;
case WebException webException:
return string.Format(AppResources.ActivityTextErrorWebException, webException.Status);
default:
return AppResources.ActivityTextErrorException;
}
}
/// Gets message that logged in user has not booked any bikes.
public static FormattedString GetErrorInfoText(this Exception p_oException)
{
if (p_oException == null)
{
return string.Empty;
}
FormattedString l_oError;
// An error occurred getting bikes information.
if (p_oException is WebConnectFailureException)
{
l_oError = new FormattedString();
l_oError.Spans.Add(new Span { Text = "Information!\r\n", FontAttributes = FontAttributes.Bold });
l_oError.Spans.Add(new Span { Text = $"{p_oException.Message}\r\n{WebConnectFailureException.GetHintToPossibleExceptionsReasons}" });
return l_oError;
}
else if (p_oException is InvalidResponseException)
{
l_oError = new FormattedString();
l_oError.Spans.Add(new Span { Text = "Fehler, ungültige Serverantwort!\r\n", FontAttributes = FontAttributes.Bold });
l_oError.Spans.Add(new Span { Text = $"{p_oException.Message}" });
return l_oError;
}
else if (p_oException is WebForbiddenException)
{
l_oError = new FormattedString();
l_oError.Spans.Add(new Span { Text = "Beschäftigt... Einen Moment bitte!" });
return l_oError;
}
l_oError = new FormattedString();
l_oError.Spans.Add(new Span { Text = "Allgemeiner Fehler!\r\n", FontAttributes = FontAttributes.Bold });
l_oError.Spans.Add(new Span { Text = $"{p_oException}" });
return l_oError;
}
/// User tabbed a URI.
/// Sender of the event.
/// Event arguments
public static void OnNavigating(object p_oSender, WebNavigatingEventArgs p_eEventArgs)
{
if (!p_eEventArgs.Url.ToUpper().StartsWith("HTTP"))
{
// An internal link was detected.
// Stay inside WebView
p_eEventArgs.Cancel = false;
return;
}
// Do not navigate outside the document.
p_eEventArgs.Cancel = true;
DependencyService.Get().OpenUrl(p_eEventArgs.Url);
}
/// Gets the user group if a user friendly name.
///
///
public static string GetUserGroupDisplayName(this User p_oUser)
{
return string.Join(" & ", p_oUser.Group);
}
/// Called when page is shown.
/// Url to load data from.
/// Holds value wether site caching is on or off.
/// Provides resource from embedded ressources.
public static async Task GetSource(
string resourceUrl,
bool isSiteCachingOn,
Func resourceProvider = null)
{
if (!Barrel.Current.IsExpired(resourceUrl) && isSiteCachingOn)
{
// Cached html is still valid and caching is on.
return Barrel.Current.Get(resourceUrl);
}
string htmlContent = string.Empty;
try
{
// Get info from web server.
htmlContent = await CopriCallsHttps.Get(resourceUrl);
}
catch (Exception l_oException)
{
// Getting html failed.
Log.Error($"Requesting {resourceUrl} failed. {l_oException.Message}");
}
switch (string.IsNullOrEmpty(htmlContent))
{
case true:
// An error occurred getting resource from web
htmlContent = Barrel.Current.Exists(resourceUrl)
? Barrel.Current.Get(key: resourceUrl) // Get from MonkeyCache
: resourceProvider != null ? resourceProvider() : $"Error loading {resourceUrl}."; // Get build in ressource.
break;
default:
// Add resource to cache.
Barrel.Current.Add(key: resourceUrl, data: htmlContent, expireIn: isSiteCachingOn ? TimeSpan.FromDays(1) : TimeSpan.FromMilliseconds(1) );
break;
}
return htmlContent ?? string.Format("An error occurred loading html- ressource.");
}
}
}