using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Paraiba.Linq;

namespace CoverageFramework.Operator.Selector.Python
{
	public class IfConditionExpressionSelectorForPython : IXElementRangeSelector
	{
		private static readonly string[] _ifNames = new[] {
			"if_stmt",
		};

		#region IXElementRangeSelector メンバ

		public IEnumerable<IEnumerable<XElement>> Select(XElement root)
		{
			// 条件演算子 (exp1 if cond else exp2) <=> (cond ? exp1 : exp2)
			// リスト内包表記 [ x * x for x in list if x > 0 ] リストを返す
			// ジェネレーター式 ( x * x for x in list if x > 0 ) ジェネレーター(Iterable)を返す

			return root
				// 全てのif文要素を列挙
				.Descendants()
				.Where(e_ => _ifNames.Contains(e_.Name.LocalName))
				// if文の条件式に射影
				.Select(e_ => e_.Elements()
					.SkipWhile(e2_ => !(!e2_.HasElements && (e2_.Value == "if" || e2_.Value == "elif")))
					.Skip(1)
					.TakeWhile(e2_ => e2_.Name.LocalName != "COLON"))
				.Where(block_ => !block_.IsEmpty());
		}

		#endregion
	}
}