using System;
using System.Collections.Generic;
using System.Linq;
using ZusiCLIProject.FileLibrary.Zusi3;
using System.IO.Pipes;
using System.Threading;

#if NETCOREAPP
namespace ZusiCLIProject.EntryPoints;
#else
namespace ZusiCLIProject.EntryPoints
{
#endif

#if NETCOREAPP
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
#endif
public class FahrzeugAntriebsStreaming
{
	public static void InfoEx(System.IntPtr callerOrNull, System.Reflection.Assembly assenbly, int id) { }
	public static int AnzahlVariantenEx(System.IntPtr callerOrNull, System.Reflection.Assembly assenbly, int id) { return 2; }
	public static string VariantenNameEx(System.IntPtr callerOrNull, System.Reflection.Assembly assenbly, int id, int index) { return "Streaming-DLL"; }
	public static NativeMethods.IFahrzeugAntrieb VarianteAktivierenEx(System.IntPtr callerOrNull, System.Reflection.Assembly assenbly, int id, int index)
	{
		LastCreated = new FahrzeugAntriebServer();
		InitPipeServer();
		return new NativeMethods.FahrzeugAntriebCatcher(LastCreated);
	}
	public static FahrzeugAntriebServer LastCreated { get; set; }

	public static void InitPipeServer()
	{
		if (m_pipeAckThread != null)
			return;
		m_pipeAckThread = new Thread(delegate () //Achtung: Unbehandelte Ausnahmen in Threads führen zu einem Appcrash. 
		{ //Da das hier ein Debugging-Scenario ist, habe ich es hier bewusst nicht behandelt, aber in Release-Versionen sollte der 
			while(m_pipeAckThread != null) // Nutzer wissen, welche DLL Probleme macht und warum.
			{
				m_pipeServer = new NamedPipeServerStream("ZusiFahrzeugAntriebsStreaming", PipeDirection.InOut);
				try
				{
					m_pipeServer.WaitForConnection();
					LastCreated.Stream = m_pipeServer;
					while(m_pipeServer.IsConnected)
					{
						System.Threading.Thread.Sleep(1000);
					}
					LastCreated.Stream = null;
					LastCreated.ResetStaticData(); //Damit Fahrzeuge nicht "durchgehen", wenn die Verbindung trippt.
					m_pipeServer.Close();
					m_pipeServer.Dispose();
					m_pipeServer = null;
				}
				catch
				{
					try
					{
						LastCreated.Stream = null;
						LastCreated.ResetStaticData(); //Damit Fahrzeuge nicht "durchgehen", wenn die Verbindung trippt.
					}
					catch { }
					m_pipeServer.Close();
					m_pipeServer.Dispose();
					m_pipeServer = null;
				}
			}
		});
		m_pipeAckThread.Start();
	}
	private static NamedPipeServerStream m_pipeServer;
	private static Thread m_pipeAckThread;
}

#if NETCOREAPP
#else
}
#endif
