using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using BizHawk.Common;
using BizHawk.Emulation.Common;

namespace BizHawk.Client.Common
{
	public class AndAdapter : IController
	{
		public bool IsPressed(string button)
		{
			return this[button];
		}

		// pass floats solely from the original source
		// this works in the code because SourceOr is the autofire controller
		public float GetFloat(string name) { return Source.GetFloat(name); }

		public IController Source { get; set; }
		public IController SourceAnd { get; set; }
		public ControllerDefinition Type { get { return Source.Type; } set { throw new InvalidOperationException(); } }

		public bool this[string button]
		{
			get
			{
				if (Source != null && SourceAnd != null)
				{
					return Source[button] & SourceAnd[button];
				}

				return false;
			}

			set
			{
				throw new InvalidOperationException();
			}
		}
	}

	public class ORAdapter : IController
	{
		public bool IsPressed(string button)
		{
			return this[button];
		}

		// pass floats solely from the original source
		// this works in the code because SourceOr is the autofire controller
		public float GetFloat(string name) { return Source.GetFloat(name); }

		public IController Source { get; set; }
		public IController SourceOr { get; set; }
		public ControllerDefinition Type { get { return Source.Type; } set { throw new InvalidOperationException(); } }

		public bool this[string button]
		{
			get
			{
				return (Source != null ? Source[button] : false) |
					(SourceOr != null ? SourceOr[button] : false);
			}
			set
			{
				throw new InvalidOperationException();
			}
		}

	}
}
