<?php
	// Definir la proporció àurea
	define('PHI', (1 + sqrt(5)) / 2); // Aproximadament 1.618

	// Funció per verificar si un nombre és de la successió de Fibonacci
	function is_fibonacci($n) {
	    $x1 = 5 * $n * $n + 4;
	    $x2 = 5 * $n * $n - 4;
	    return is_perfect_square($x1) || is_perfect_square($x2);
	}

	// Funció auxiliar per verificar si un nombre és quadrat perfecte
	//function is_perfect_square($x) {
	//    $s = intval(sqrt($x));
	//    return $s * $s == $x;
	//}

	// Funció per verificar si dos nombres són consecutius a la successió de Fibonacci
	function are_consecutive_fibonacci($a, $b) {
	    $fibonacci_numbers = [];
	    $f1 = 0;
	    $f2 = 1;
	    // Generar una sèrie de nombres de Fibonacci fins a trobar a i b
	    while ($f1 <= max($a, $b)) {
		$fibonacci_numbers[] = $f1;
		$next = $f1 + $f2;
		$f1 = $f2;
		$f2 = $next;
	    }
	    // Buscar si a i b són consecutius en la sèrie de Fibonacci
	    for ($i = 0; $i < count($fibonacci_numbers) - 1; $i++) {
		if (($fibonacci_numbers[$i] == $a && $fibonacci_numbers[$i + 1] == $b) || ($fibonacci_numbers[$i] == $b && $fibonacci_numbers[$i + 1] == $a)) {
		    return true;
		}
	    }
	    return false;
	}

	// Funció per dibuixar l'espiral de Fibonacci
	function draw_fibonacci_spiral($image, $x, $y, $side_length, $line_color, $start_direction = 'right') {
	    $arc_start_angle = [
		'right' => 270, // Quarts de cercle amb el seu inici des del quadrat superior dret
		'down' => 0,
		'left' => 90,
		'up' => 180,
	    ];

	    // Dibuixar un quart de cercle per l'espiral
	    imagearc($image, intval($x), intval($y), 2 * $side_length, 2 * $side_length, $arc_start_angle[$start_direction], $arc_start_angle[$start_direction] + 90, $line_color);
	}

	// Valorar els paràmetres passats per l'usuari a través de l'URL (amplada, alçada i escala)
	$width = isset($_GET['width']) ? intval($_GET['width']) : 233;  // Amplada per defecte 233
	$height = isset($_GET['height']) ? intval($_GET['height']) : 144; // Alçada per defecte 144
	$scale = isset($_GET['scale']) ? floatval($_GET['scale']) : 5; // Escala per defecte de 5

	// Verificar si l'amplada i l'alçada són nombres consecutius de Fibonacci
	if (!are_consecutive_fibonacci($width, $height)) {
	    // Mostrar missatge d'error si no són consecutius
	    echo "Error: L'amplada ($width) i l'alçada ($height) han de ser nombres consecutius de la successió de Fibonacci.";
	    exit;
	}

	// Escalar les dimensions del rectangle segons el factor d'escala
	$scaled_width = $width * $scale;
	$scaled_height = $height * $scale;

	// Definir la mida de la imatge (afegim un marge de 20 píxels per tots costats)
	$image_width = $scaled_width + 20;
	$image_height = $scaled_height + 20;

	// Crear la imatge amb les dimensions calculades
	$image = imagecreatetruecolor($image_width, $image_height);

	// Definir els colors
	$background_color = imagecolorallocate($image, 255, 255, 240); // Color de fons ivori
	$rectangle_color = imagecolorallocate($image, 0, 0, 0); // Negre per dibuixar els rectangles
	$line_color = imagecolorallocate($image, 255, 0, 0); // Vermell per les línies de divisió i l'espiral

	// Omplir la imatge amb el color de fons
	imagefill($image, 0, 0, $background_color);

	// Funció per dibuixar el rectangle i dividir-lo segons la proporció àurea, incloent l'espiral
	function divide_rectangle($image, $x, $y, $width, $height, $line_color, $rectangle_color, $direction = 'right') {
	    // Si el costat més petit del rectangle és molt proper a 1 unitat, finalitzem el procés
	    if ($width <= 1 || $height <= 1) {
		
		//
		// últim tram aproximat, s'hauria d'ajustar (ajustat a 233-144, scale=10, amb once fractals, rotades en sentit horari, del rectangle inicial)
		//
		$golden_side = $width / 2; // El quadrat té un costat igual a l'amplada del rectangle	
		return;
	    	}

	    // Dividim segons la proporció àurea
	    if ($direction == 'right') { // Primera divisió, quadrat a la dreta
		$golden_side = $height; // El quadrat té un costat igual a l'alçada del rectangle
		imagerectangle($image, $x + $width - $golden_side, $y, $x + $width, $y + $golden_side, $rectangle_color); // Quadrat a la dreta
		imagerectangle($image, $x, $y, $x + ($width - $golden_side), $y + $height, $rectangle_color); // Rectangle restant a l'esquerra

		// Línia de divisió vertical
		imageline($image, $x + $width - $golden_side, $y, $x + $width - $golden_side, $y + $height, $line_color);

		// Dibuixar l'espiral (quart de cercle)
		draw_fibonacci_spiral($image, $x + $width - $golden_side, $y, $golden_side, $line_color, 'down');

		// Continuar dividint el rectangle restant a l'esquerra
		divide_rectangle($image, $x, $y, $width - $golden_side, $height, $line_color, $rectangle_color, 'down');
	    } elseif ($direction == 'down') { // Segona divisió, quadrat a la part inferior
		$golden_side = $width; // El quadrat té un costat igual a l'amplada del rectangle
		imagerectangle($image, $x, $y + $height - $golden_side, $x + $golden_side, $y + $height, $rectangle_color); // Quadrat a la part inferior
		imagerectangle($image, $x, $y, $x + $width, $y + $height - $golden_side, $rectangle_color); // Rectangle restant a la part superior

		// Línia de divisió horitzontal
		imageline($image, $x, $y + $height - $golden_side, $x + $width, $y + $height - $golden_side, $line_color);

		// Dibuixar l'espiral (quart de cercle)
		draw_fibonacci_spiral($image, $x + $width, $y + $height - $golden_side, $golden_side, $line_color, 'left');

		// Continuar dividint el rectangle restant a la part superior
		divide_rectangle($image, $x, $y, $width, $height - $golden_side, $line_color, $rectangle_color, 'left');
	    } elseif ($direction == 'left') { // Tercera divisió, quadrat a l'esquerra
		$golden_side = $height; // El quadrat té un costat igual a l'alçada del rectangle
		imagerectangle($image, $x, $y, $x + $golden_side, $y + $golden_side, $rectangle_color); // Quadrat a l'esquerra
		imagerectangle($image, $x + $golden_side, $y, $x + $width, $y + $height, $rectangle_color); // Rectangle restant a la dreta

		// Línia de divisió vertical
		imageline($image, $x + $golden_side, $y, $x + $golden_side, $y + $height, $line_color);

		// Dibuixar l'espiral (quart de cercle)
		draw_fibonacci_spiral($image, $x + $golden_side, $y + $golden_side, $golden_side, $line_color, 'up');

		// Continuar dividint el rectangle restant a la dreta
		divide_rectangle($image, $x + $golden_side, $y, $width - $golden_side, $height, $line_color, $rectangle_color, 'up');   
	    } elseif ($direction == 'up') { // Quarta divisió, quadrat a la part superior
		$golden_side = $width; // El quadrat té un costat igual a l'amplada del rectangle
		imagerectangle($image, $x, $y, $x + $golden_side, $y + $golden_side, $rectangle_color); // Quadrat a la part superior
		imagerectangle($image, $x, $y + $golden_side, $x + $width, $y + $height, $rectangle_color); // Rectangle restant a la part inferior

		// Línia de divisió horitzontal
		imageline($image, $x, $y + $golden_side, $x + $width, $y + $golden_side, $line_color);

		// Dibuixar l'espiral (quart de cercle)
		draw_fibonacci_spiral($image, $x, $y + $golden_side, $golden_side, $line_color, 'right');

		// Continuar dividint el rectangle restant a la part inferior
		divide_rectangle($image, $x, $y + $golden_side, $width, $height - $golden_side, $line_color, $rectangle_color, 'right');
	    }
	}

	// Dibuixar el rectangle inicial escalat
	imagerectangle($image, 10, 10, 10 + $scaled_width, 10 + $scaled_height, $rectangle_color);

	// Cridar la funció per dividir el rectangle inicial
	divide_rectangle($image, 10, 10, $scaled_width, $scaled_height, $line_color, $rectangle_color, 'right'); // Inicial quadrat a la dreta

	// Guardar o mostrar la imatge
	header('Content-Type: image/png');
	imagepng($image);

	// Netejar la memòria
	imagedestroy($image);
?>