#include "rugby-scoring.h"

/**
 * rugby_scoring_get_possibilities:
 * @score: the score of a team
 *
 * Gets the possible ways of scoring @score points, as a %GVariant of the
 * type "a(iii)", in the order "tries, utries, pens".
 *
 * Returns: (transfer-none): the possibilities, or %NULL in the case there are
 * none
 */
GVariant *
rugby_scoring_get_possibilities (gint score)
{
	GVariantBuilder builder;
	gint possibilities = 0;
	gint max_tries, max_utries;
	gint tries, utries;

	g_return_val_if_fail (score >= 0, NULL);

	g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);

	max_tries = (gint) (score / TRY_POINTS);
	max_utries = (gint) (score / UTRY_POINTS);

	for (tries = 0; tries <= max_tries; tries++)
	{
		for (utries = 0; utries <= max_utries; utries++)
		{
			gint left;

			/* Calculate left over score for penalties */
			left = score - (tries * TRY_POINTS) - (utries * UTRY_POINTS);

			if (left < 0)
				continue;

			/* If the score after pens is 0, it's a possibility */
			if (left % KICK_POINTS == 0)
			{
				gint pens;

				pens = left / KICK_POINTS;

				/* Add result to variant */
				g_variant_builder_add (&builder, "(iii)", tries, utries, pens);
				possibilities++;
			}
		}
	}

	if (possibilities == 0)
		return NULL;
	else
		return g_variant_builder_end (&builder);
}

/**
 * rugby_scoring_get_max_tries:
 * @score: the score of a team
 *
 * Gets the maximum number of tries possible for a given score. Not related to
 * Max Evans.
 *
 * Returns: the maximum number of tries possible
 */
gint
rugby_scoring_get_max_tries (gint score)
{
	return (score % 5 == 1) ? score / UTRY_POINTS - 1 : score / UTRY_POINTS;
}

/**
 * rugby_scoring_get_max_kicks:
 * @score: the score of a team
 *
 * Gets the maximum number of kicks (penalties and drop goals) for a given score.
 *
 * Returns: the maximum number of kicks possible
 */
gint
rugby_scoring_get_max_kicks (gint score)
{
	return (score % 3 == 1) ? score / KICK_POINTS : score / KICK_POINTS - 1;
}