<?php
	require_once('db.php');

	function nomcurs($curs) {
		if ($curs == 1) return "1r";
		if ($curs == 2) return "2n";
		if ($curs == 3) return "3r";
		if ($curs == 4) return "4t";
		if ($curs == 5) return "5è";
		if ($curs == 6) return "6è";
		if ($curs == 7) return "7è";
		if ($curs == 8) return "8è";
		if ($curs > 8) return "Eternal";
		return "?";
	}

	function nomgrau($grau) {
		if ($grau == 0) return "MAT";
		if ($grau == 1) return "EST";
		if ($grau == 2) return "MAMME";
	}

	class User{
		public $id;
		public $nomcomplet;
		public $curs;
		public $grau;
		public $quimata;

		public function nom() {
			$noms = explode(" ", $this->nomcomplet);
			return $noms[0];
		}

		public function nomcurs() {
			return nomcurs($this->curs);
		}

		public function nomgrau() {
			return nomgrau($this->grau);
		}
	}

	function query($query) {
		global $conn;

		// Execute query and save result
		$result = $conn->query($query);

		// Return result of query
		return $result;
	}

	function get_users($id = 0, $getAsObjects = true) {
		$users = [];

		$credentials = new Credentials();
		$usersdb = $credentials->usersdb;
		$mortsdb = $credentials->mortsdb;

		// Prepare the query
		$query = "SELECT * FROM $usersdb";
		if ($id > 0) $query .= " WHERE id=".(int)$id;

		// Fetch the information of the user
		if ($result = query($query)) {
			while ($row = $result->fetch_row()) {
				if ($getAsObjects) {
					$user = new User();
					$user->id = (int)$row[0];
					$user->nomcomplet = $row[1];
					$user->curs = (int)$row[2];
					$user->grau = (int)$row[3];
					$user->quimata = (int)$row[4];
					$user->requested = (int)$row[5];
					$user->mort = (int)$row[6];
					$user->md5password = $row[7];
					$user->bits = $row[8];
				} else {
					$user = [];
					$user["id"] = (int)$row[0];
					$user["nomcomplet"] = $row[1];
					$user["curs"] = (int)$row[2];
					$user["grau"] = (int)$row[3];
					$user["quimata"] = (int)$row[4];
					$user["requested"] = (int)$row[5];
					$user["mort"] = (int)$row[6];
					$user["md5password"] = $row[7];
					$user["bits"] = $row[8];
				}

				array_push($users, $user);
			}
			$result->close();
		} else {
			die("Query failed: " . $query);
		}

		if ($id > 0) return $users[0];
		else return $users;
	}

	// Number n to XXXXXXXXX with X = {0,1} binary format
	function dec2bits($code) {
		$bits = decbin($code);
		while (strlen($bits) < 9) $bits = '0' . $bits;
		return $bits;
	}
?>
