using System;
using Serilog;
using ShareeBike.Model.Connector;
using ShareeBike.Repository.Response;
namespace ShareeBike.Repository
{
public static class CopriCallsStatic
{
#if !USCSHARP9
private static Version UNSUPPORTEDFUTURECOPRIVERSIONLOWER = new Version(4, 1);
#else
private static Version UNSUPPORTEDFUTURECOPRIVERSIONLOWER = new(4, 1);
#endif
#if !USCSHARP9
private static Version UNSUPPORTEDFUTURECOPRIVERSIONUPPER = new Version(4, 2);
#else
private static Version UNSUPPORTEDFUTURECOPRIVERSIONUPPER = new(4, 2);
#endif
public static Version UnsupportedVersionLower => UNSUPPORTEDFUTURECOPRIVERSIONLOWER;
public static Version UnsupportedVersionUpper => UNSUPPORTEDFUTURECOPRIVERSIONUPPER;
/// Deserializes response JSON if response is of supported version or provides default response otherwise.
/// Type of response object.
/// Response JSON.
/// Factory providing default delegate.
/// Response object.
public static T DeserializeResponse(this string response, Func emptyResponseFactory) where T : class
{
// Get COPRI version from response.
var bikeInfoBase = JsonConvertRethrow.DeserializeObject(response)?.shareejson;
if (bikeInfoBase.GetCopriVersion() < UNSUPPORTEDFUTURECOPRIVERSIONLOWER
|| bikeInfoBase.GetCopriVersion() >= UNSUPPORTEDFUTURECOPRIVERSIONUPPER)
{
return emptyResponseFactory?.Invoke(bikeInfoBase.copri_version) ?? null;
}
return JsonConvertRethrow.DeserializeObject>(response)?.shareejson;
}
/// Deserializes response JSON if response is of supported version or throws an exception.
/// Type of response object.
/// Response JSON.
/// Exception to fire.
/// Response object.
public static T DeserializeResponse(
this string response,
Func unsupportedVersionExectpion = null) where T : class
{
// Get COPRI version from response.
var bikeInfoBase = JsonConvertRethrow.DeserializeObject(response)?.shareejson;
if (bikeInfoBase.GetCopriVersion() < UNSUPPORTEDFUTURECOPRIVERSIONLOWER
|| bikeInfoBase.GetCopriVersion() >= UNSUPPORTEDFUTURECOPRIVERSIONUPPER)
{
Log.Error($"Unsupported copri version {bikeInfoBase.copri_version} detected on attempt to log in.");
throw unsupportedVersionExectpion?.Invoke(bikeInfoBase.copri_version) ?? new System.Exception($"Unsupported COPRI version {bikeInfoBase.copri_version} detected.");
}
return JsonConvertRethrow.DeserializeObject>(response)?.shareejson;
}
}
}