using System;
namespace AsterNET.FastAGI.Command
{
	
	/// <summary>
	/// Plays the given file, allowing playback to be interrupted by the given digits, if any.<br/>
	/// If offset is provided then the audio will seek to sample offset before play starts.<br/>
	/// Returns 0 if playback completes without a digit being pressed, or the ASCII
	/// numerical value of the digit if one was pressed, or -1 on error or if the
	/// channel was disconnected. <br/>
	/// Remember, the file extension must not be included in the filename.
	/// </summary>
	public class StreamFileCommand : AGICommand
	{
		#region File
		/// <summary>
		/// Get/Set the name of the file to stream.
		/// The name of the file to stream, must not include extension.
		/// </summary>
		public string File
		{
			get
			{
				return file;
			}
			set
			{
				this.file = value;
			}
		}
		#endregion

		#region EscapeDigits
		/// <summary>
		/// Get/Set the digits that allow the user to interrupt this command.
		/// </summary>
		public string EscapeDigits
		{
			get
			{
				return escapeDigits;
			}
			
			set
			{
				this.escapeDigits = value;
			}
		}
		#endregion

		#region Offset
		/// <summary>
		/// Get/Set the offset samples to skip before streaming.
		/// </summary>
		public int Offset
		{
			get
			{
				return offset;
			}
			
			set
			{
				this.offset = value;
			}
		}
		#endregion

		/// <summary> The name of the file to stream.</summary>
		private string file;
		
		/// <summary> When one of these digits is pressed while streaming the command returns.</summary>
		private string escapeDigits;
		
		/// <summary> The offset samples to skip before streaming.</summary>
		private int offset;
		
		/// <summary> Creates a new StreamFileCommand, streaming from the beginning.
		/// 
		/// </summary>
		/// <param name="file">the name of the file to stream, must not include extension.
		/// </param>
		public StreamFileCommand(string file)
		{
			this.file = file;
			this.escapeDigits = null;
			this.offset = - 1;
		}
		
		/// <summary>
		/// Creates a new StreamFileCommand, streaming from the beginning.
		/// </summary>
		/// <param name="file">the name of the file to stream, must not include extension.</param>
		/// <param name="escapeDigits">contains the digits that allow the user to interrupt this command.</param>
		public StreamFileCommand(string file, string escapeDigits)
		{
			this.file = file;
			this.escapeDigits = escapeDigits;
			this.offset = - 1;
		}
		
		/// <summary>
		/// Creates a new StreamFileCommand, streaming from the given offset.
		/// </summary>
		/// <param name="file">the name of the file to stream, must not include extension.</param>
		/// <param name="escapeDigits">contains the digits that allow the user to interrupt this command.
		/// Maybe null if you don't want the user to interrupt.
		/// </param>
		/// <param name="offset">the offset samples to skip before streaming.</param>
		public StreamFileCommand(string file, string escapeDigits, int offset)
		{
			this.file = file;
			this.escapeDigits = escapeDigits;
			this.offset = offset;
		}
		
		public override string BuildCommand()
		{
			return "STREAM FILE " + EscapeAndQuote(file) + " " + EscapeAndQuote(escapeDigits) + (offset < 0?"":" " + offset);
		}
	}
}