using skyscraper5.Skyscraper.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace skyscraper8.DvbNip
{
	public class NipActualCarrierInformation
	{
		public NipActualCarrierInformation(byte[] buffer)
		{
			MemoryStream ms = new MemoryStream(buffer, false);
			NipNetworkId = ms.ReadUInt16BE();
			NipCarrierId = ms.ReadUInt16BE();
			NipLinkId = ms.ReadUInt16BE();
			NipServiceId = ms.ReadUInt16BE();
			byte reserved = ms.ReadUInt8();
			byte length = ms.ReadUInt8();
			NipStreamProviderName = Encoding.UTF8.GetString(ms.ReadBytes(length));
		}

		public NipActualCarrierInformation(ushort nipNetworkId, ushort nipCarrierId, ushort nipLinkId, ushort nipServiceId, string nipStreamProviderName)
		{
			NipNetworkId = nipNetworkId;
			NipCarrierId = nipCarrierId;
			NipLinkId = nipLinkId;
			NipServiceId = nipServiceId;
			NipStreamProviderName = nipStreamProviderName;
		}

		public ushort NipNetworkId { get; }
		public ushort NipCarrierId { get; }
		public ushort NipLinkId { get; }
		public ushort NipServiceId { get; }
		public string NipStreamProviderName { get; }

		protected bool Equals(NipActualCarrierInformation other)
		{
			return NipNetworkId == other.NipNetworkId && NipCarrierId == other.NipCarrierId && NipLinkId == other.NipLinkId && NipServiceId == other.NipServiceId;
		}

		public override bool Equals(object? obj)
		{
			if (ReferenceEquals(null, obj)) return false;
			if (ReferenceEquals(this, obj)) return true;
			if (obj.GetType() != this.GetType()) return false;
			return Equals((NipActualCarrierInformation)obj);
		}

		public override int GetHashCode()
		{
			return HashCode.Combine(NipNetworkId, NipCarrierId, NipLinkId, NipServiceId);
		}
	}
}
