using Dfs.WayneChina.GilbarcoDispenserPayTerminal;
using Dfs.WayneChina.GilbarcoDispenserPayTerminal.MessageEntities.Incoming;
using Edge.Core.Processor;
using NLog.LayoutRenderers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Dfs.WayneChina.GilbarcoPos
{
///
/// A POS like component against ChangGi (Gilbarco China) dispenser with Sinopec IC card protocol.
/// 长吉加油机带中石化卡机联动协议的后台类POS模块。
///
public class GilbarcoPosApp : IAppProcessor
{
#region IApplication implementation
public string MetaConfigName { get; set; }
private List paymentTerminalHandlers;
private List terminalManagers;
private int _posId;
private int _interval;
private string _versionInfoList;
public VersionInfo CurrentVersionInfo { get; private set; }
#region Logger
private NLog.Logger logger = NLog.LogManager.LoadConfiguration("NLog.config").GetLogger("IPosPlusApp");
#endregion
public GilbarcoPosApp(int posId, int interval, string versionInfoList)
{
_posId = posId;
_interval = interval;
_versionInfoList = versionInfoList;
SetVersionInfo(_versionInfoList);
MetaConfigName = "GilbarcoPosApp";
paymentTerminalHandlers = new List();
terminalManagers = new List();
}
public void Init(IEnumerable processors)
{
foreach (dynamic p in processors)
{
if (p is IAppProcessor)
continue;
var handler = p.Context.Handler;
if (handler is GilbarcoPayTerminalHandler)
{
paymentTerminalHandlers.Add(handler);
}
}
SetupTerminalManagers();
}
public Task Start()
{
foreach (var handler in paymentTerminalHandlers)
{
logger.Info("Hooking up the terminal message event handler");
handler.OnTerminalMessageReceived += IcCardPaymentTerminalMessageReceived;
}
foreach (var terminalManager in terminalManagers)
{
terminalManager.Start();
}
return Task.FromResult(true);
}
public Task Stop()
{
foreach (var handler in paymentTerminalHandlers)
{
logger.Info("Unhooking the terminal message event handler");
handler.OnTerminalMessageReceived -= IcCardPaymentTerminalMessageReceived;
}
return Task.FromResult(true);
}
#endregion
private void SetVersionInfo(string versionInfoList)
{
var versions = versionInfoList.Split(',');
if (versions.Length == 8)
{
CurrentVersionInfo = new VersionInfo();
CurrentVersionInfo.BaseBlacklistVersion = ushort.Parse(versions[0]);
CurrentVersionInfo.AddBlacklistVersion = Convert.ToByte(versions[1]);
CurrentVersionInfo.DeleteBlacklistVersion = Convert.ToByte(versions[2]);
CurrentVersionInfo.WhitelistVersion = Convert.ToByte(versions[3]);
CurrentVersionInfo.PriceVersion = Convert.ToByte(versions[4]);
CurrentVersionInfo.StationGeneralInfoVersion = Convert.ToByte(versions[5]);
CurrentVersionInfo.PrivateDataDownloadFlag = Convert.ToByte(versions[6]);
CurrentVersionInfo.SoftwareDownloadFlag = Convert.ToByte(versions[7]);
}
}
private void IcCardPaymentTerminalMessageReceived(object sender, TerminalMessageEventArgs e)
{
HandlerTerminalMessage(e);
}
private void HandlerTerminalMessage(TerminalMessageEventArgs messageEventArgs)
{
var currentTerminalManager = terminalManagers.FirstOrDefault(m => m.PumpId == messageEventArgs.PumpId);
if (currentTerminalManager != null)
{
if (messageEventArgs.Message is InfoCommand)
{
currentTerminalManager.HandleInfoCommand((InfoCommand)messageEventArgs.Message);
}
else if (messageEventArgs.Message is TransactionData)
{
currentTerminalManager.HandleTransactionData((TransactionData)messageEventArgs.Message);
}
}
}
#region Set up terminals
private void SetupTerminalManagers()
{
foreach (var handler in paymentTerminalHandlers)
{
var terminalManager = new TerminalManager(this, handler, _interval);
if (!terminalManagers.Contains(terminalManager))
terminalManagers.Add(terminalManager);
}
}
#endregion
}
}