<?php
/*
* Copyright (c) Eclipse Foundation and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/

require_once dirname(__FILE__) . '/Project.class.php';
require_once dirname(__FILE__) . '/database.inc';

/**
 * This is a simple representation of a working group
 */
class WorkingGroup {

	var $data;

	public static function getWorkingGroup($id) {
		$wg = null;
		$sql = "select id, name from WorkingGroup where id=':id:';";
		query('dashboard', $sql, array(':id:' => $id), function($row) use (&$wg) {
			$wg = new WorkingGroup($row);
		});
		return $wg;
	}

	public static function getAll() {
		$wg = array();
		$sql = "select id, name from WorkingGroup";
		query('dashboard', $sql, array(), function($row) use (&$wg) {
			$wg[] = new WorkingGroup($row);
		});
		return $wg;
	}

	public static function getAny() {
		$wg = null;
		$sql = "select id, name from WorkingGroup order by rand() limit 1";
		query('dashboard', $sql, array(), function($row) use (&$wg) {
			$wg = new WorkingGroup($row);
		});
		return $wg;
	}

	private function __construct($data) {
		$this->data = $data;
	}

	public function getId() {
		return $this->data['id'];
	}

	public function getName() {
		return $this->data['name'];
	}

	public function projectsDo($callback) {
		$sql = "
			select
				wgp.id,
				p.id as project
			from WorkingGroupProject as wgp
			join Project as p on wgp.project=p.id
			where wgp.id=':id:'";

		query('dashboard', $sql, array(':id:' => $this->getId()), function($row) use (&$callback) {
			if ($project = Project::getProject($row['project'])) {
				call_user_func($callback, $project);
			}
		});
	}
}