<?php namespace System\DB\Query;

use System\Str;

class Dynamic {

	/**
	 * Add conditions to a query from a dynamic method call.
	 *
	 * @param  string  $method
	 * @param  array   $parameters
	 * @param  Query   $query
	 * @return Query
	 */
	public static function build($method, $parameters, $query)
	{
		// Strip the "where_" off of the method.
		$finder = substr($method, 6);

		// Split the column names from the connectors.
		$segments = preg_split('/(_and_|_or_)/i', $finder, -1, PREG_SPLIT_DELIM_CAPTURE);

		// The connector variable will determine which connector will be used for the condition.
		// We'll change it as we come across new connectors in the dynamic method string.
		//
		// The index variable helps us get the correct parameter value for the where condition.
		// We increment it each time we add a condition.
		$connector = 'AND';

		$index = 0;

		foreach ($segments as $segment)
		{
			if ($segment != '_and_' and $segment != '_or_')
			{
				if ( ! array_key_exists($index, $parameters))
				{
					throw new \Exception("Wrong number of parameters for dynamic finder [$method].");					
				}

				$query->where($segment, '=', $parameters[$index], $connector);

				$index++;
			}
			else
			{
				$connector = trim(strtoupper($segment), '_');
			}
		}

		return $query;
	}

}