#include <unistd.h>

/*
** Copia local de ft_putchar: el enunciado solo permite entregar este archivo.
** Escribe un unico caracter en la salida estandar.
*/
static void	put_char(char c)
{
	write(1, &c, 1);
}

/* Escribe los n digitos que hay guardados en el array. */
static void	print_combination(char *digits, int n)
{
	int	index;

	index = 0;
	while (index < n)
	{
		put_char(digits[index]);
		index++;
	}
}

/*
** Rellena la posicion indicada con todos los digitos posibles y baja un nivel.
** El tope de cada posicion deja sitio a los digitos que faltan a la derecha:
** asi nunca se pasa de '9' y cada combinacion sale ordenada y sin repetir.
*/
static void	build_combinations(char *digits, int position, int n, int *first)
{
	char	digit;
	char	last;

	last = '0' + 10 - (n - position);
	if (position == 0)
		digit = '0';
	else
		digit = digits[position - 1] + 1;
	while (digit <= last)
	{
		digits[position] = digit;
		if (position == n - 1)
		{
			if (!*first)
			{
				put_char(',');
				put_char(' ');
			}
			*first = 0;
			print_combination(digits, n);
		}
		else
			build_combinations(digits, position + 1, n, first);
		digit++;
	}
}

/*
** Muestra todas las combinaciones de n digitos distintos en orden creciente.
** El enunciado garantiza 0 < n < 10; fuera de ese rango no se dibuja nada.
*/
void	ft_print_combn(int n)
{
	char	digits[10];
	int		first;

	if (n <= 0 || n >= 10)
		return ;
	first = 1;
	build_combinations(digits, 0, n, &first);
	put_char('\n');
}
