using System;

namespace FileHelpers
{

	internal sealed class ExtractedInfo
	{
		//public int CharsRemoved;
		//public string ExtractedString;

		internal string mCustomExtractedString = null;

		public string ExtractedString()
		{
			if (mCustomExtractedString == null)
				return new string(mLine.mLine, ExtractedFrom, ExtractedTo - ExtractedFrom + 1);
			else
				return mCustomExtractedString;
			//			return new string(mLine,  .mLine.Substring(ExtractedFrom, ExtractedTo - ExtractedFrom + 1);

		}

		public int Length
		{
			get { return ExtractedTo - ExtractedFrom + 1;}
		}

		public LineInfo mLine;
		public int ExtractedFrom;
		public int ExtractedTo;

		//public int ExtraLines;
		//public string NewRestOfLine;
		//public string TrailString;

		public ExtractedInfo(LineInfo line)
		{
			mLine = line;
			ExtractedFrom = line.mCurrentPos;
			ExtractedTo = line.mLine.Length - 1;
			//CharsRemoved = ExtractedTo - ExtractedFrom + 1;
			//ExtraLines = 0;
		//	NewRestOfLine = null;
		}

		public ExtractedInfo(LineInfo line, int extractTo)
		{
			mLine = line;
			ExtractedFrom = line.mCurrentPos;
			ExtractedTo = extractTo - 1;
			//CharsRemoved = ExtractedTo - ExtractedFrom + 1;
			//ExtraLines = 0;
		//	NewRestOfLine = null;
		}
		
		public ExtractedInfo(string customExtract)
		{
			mCustomExtractedString = customExtract;
		}
		
		public void TrimStart(char[] sortedToTrim)
		{
			if (mCustomExtractedString != null)
				mCustomExtractedString = mCustomExtractedString.TrimStart(sortedToTrim);
			else
				while(ExtractedFrom < ExtractedTo&& Array.BinarySearch(sortedToTrim, mLine.mLine[ExtractedFrom]) >= 0)
					ExtractedFrom++;
		}

		public void TrimEnd(char[] sortedToTrim)
		{
			if (mCustomExtractedString != null)
				mCustomExtractedString = mCustomExtractedString.TrimEnd(sortedToTrim);
			else
				while(ExtractedTo > ExtractedFrom && Array.BinarySearch(sortedToTrim, mLine.mLine[ExtractedTo]) >= 0)
					ExtractedTo--;
		}

		public void TrimBoth(char[] sortedToTrim)
		{
			if (mCustomExtractedString != null)
				mCustomExtractedString = mCustomExtractedString.Trim(sortedToTrim);
			else
			{
				while(ExtractedFrom <= ExtractedTo && Array.BinarySearch(sortedToTrim, mLine.mLine[ExtractedFrom]) >= 0)
				{
					ExtractedFrom++;
				}
			
				while(ExtractedTo > ExtractedFrom && Array.BinarySearch(sortedToTrim, mLine.mLine[ExtractedTo]) >= 0)
				{
					ExtractedTo--;
				}
			}
		}

		//
		//				  public ExtractedInfo(string extracted, int charsRem, int lines)
		//				  {
		//					  ExtractedString = extracted;
		//					  CharsRemoved = charsRem;
		//					  ExtraLines = lines;
		//					  NewRestOfLine = null;
		//				  }

		internal static readonly ExtractedInfo Empty = new ExtractedInfo(string.Empty);

		public bool HasOnlyThisChars(char[] sortedArray)
		{
			// Check if the chars at pos or right are empty ones
			if (mCustomExtractedString != null)
			{
				int pos = 0;
				while ( pos <  mCustomExtractedString.Length && 
						Array.BinarySearch(sortedArray,  mCustomExtractedString[pos]) >= 0 )
				{
					pos++;
				}
			
				return pos == mCustomExtractedString.Length;
			}
			else
			{

				int pos = ExtractedFrom;
				while(pos <= ExtractedTo && Array.BinarySearch(sortedArray, mLine.mLine[pos]) >= 0)
				{
					pos++;
				}
			
				return pos > ExtractedTo;
			}
		}
	}

}