//#define ENABLE_LOG
/*
 * Copyright (c) 2014 - 2022 t_saki@serenegiant.com 
 */

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Serenegiant.UVC
{
	/**
	 * UVC设备的过滤器定义类
	 */
	[Serializable]
	public class UVCFilter
	{
		private const string TAG = "UVCFilter#";

		/**
		 * 用于在检查器中显示过滤器注释的字符串（不在脚本中使用）
		 */
		public string Description;
		/**
		 * 匹配的供应商标识
		 * 0的话就全部匹配
		 */
		public int Vid;
		/**
		 * 匹配产品标识
		 * 0的话就全部匹配
		 */
		public int Pid;
		/**
		 * 匹配的设备名称
		 * null/empty的话不检查
		 */
		public string DeviceName;
		/**
		 * 是否作为排除过滤器处理
		 */
		public bool IsExclude;

		//--------------------------------------------------------------------------------

		/**
		 * 获取是否匹配参数的UVC设备
		 * @param device
		 */
		public bool Match(UVCDevice device)
		{
			bool result = device != null;

			if (result)
			{
				result &= ((Vid <= 0) || (Vid == device.vid))
					&& ((Pid <= 0) || (Pid == device.pid))
					&& (String.IsNullOrEmpty(DeviceName)
						|| DeviceName.Equals(device.name)
						|| DeviceName.Equals(device.name)
						|| (String.IsNullOrEmpty(device.name) || device.name.Contains(DeviceName))
						|| (String.IsNullOrEmpty(device.name) || device.name.Contains(DeviceName))
					);
			}

			return result;
		}

		//--------------------------------------------------------------------------------

		/**
		 * UVC设备的过滤器处理用
		 * 如果filters为空，则匹配
		 * 在排除过滤器中命中时，此时结束评价并返回false
		 * 不命中排除过滤器，如果命中通常过滤器中的任一个，则返回true
		 * @param device
		 * @param filters Nullable
		 */
		public static bool Match(UVCDevice device, List<UVCFilter> filters/*Nullable*/)
		{
			return Match(device, filters != null ? filters.ToArray() : (null as UVCFilter[]));
		}

		/**
		 * UVC设备的过滤器处理用
		 * 如果filters为空，则匹配
		 * 在排除过滤器中命中时，此时结束评价并返回false
		 * 不命中排除过滤器，如果命中通常过滤器中的任一个，则返回true
		 * @param device
		 * @param filters Nullable
		 */
		public static bool Match(UVCDevice device, UVCFilter[] filters/*Nullable*/)
		{
			var result = true;

			if ((filters != null) && (filters.Length > 0))
			{
				result = false;
				foreach (var filter in filters)
				{
					if (filter != null)
					{
						var b = filter.Match(device);
						if (b && filter.IsExclude)
						{   // 在排除过滤器中命中时，此时结束过滤器处理
							result = false;
							break;
						}
						else
						{   // 只要打到一个就好了
							result |= b;
						}
					}
					else
					{
						// 空滤镜要匹配
						result = true;
					}

				}
			}

#if (!NDEBUG && DEBUG && ENABLE_LOG)
			Console.WriteLine($"{TAG}Match({device}):result={result}");
#endif
			return result;
		}

	} // class UVCFilter

} // namespace Serenegiant.UVC
