<?php
/**
 * @copyright Copyright (c) 2010, The volkszaehler.org project
 * @package default
 * @license http://www.opensource.org/licenses/gpl-license.php GNU Public License
 */
/*
 * This file is part of volkzaehler.org
 *
 * volkzaehler.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * volkzaehler.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with volkszaehler.org. If not, see <http://www.gnu.org/licenses/>.
 */

namespace Volkszaehler\Model;

use Volkszaehler\Interpreter;
use Doctrine\ORM;
use Doctrine\Common\Collections;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Aggregator entity
 *
 * @author Steffen Vogel <info@steffenvogel.de>
 * @package default
 * @todo use nested sets: http://github.com/blt04/doctrine2-nestedset
 *
 * @Entity
 */
class Aggregator extends Entity {
	/**
	 * @ManyToMany(targetEntity="Channel", inversedBy="groups")
	 * @JoinTable(name="groups_channel",
	 * 		joinColumns={@JoinColumn(name="group_id", referencedColumnName="id")},
	 * 		inverseJoinColumns={@JoinColumn(name="channel_id", referencedColumnName="id")}
	 * )
	 */
	protected $channels = NULL;

	/**
	 * @ManyToMany(targetEntity="Aggregator", inversedBy="parents")
	 * @JoinTable(name="groups_groups",
	 * 		joinColumns={@JoinColumn(name="parent_id", referencedColumnName="id")},
	 * 		inverseJoinColumns={@JoinColumn(name="child_id", referencedColumnName="id")}
	 * )
	 */
	protected $children = NULL;

	/**
	 * @ManyToMany(targetEntity="Aggregator", mappedBy="children")
	 */
	protected $parents = NULL;

	/**
	 * Construct
	 */
	public function __construct($properties = array()) {
		parent::__construct($properties);

		$this->channels = new ArrayCollection();
		$this->children = new ArrayCollection();
		$this->parents = new ArrayCollection();
	}

	/**
	 * Adds group as new child
	 *
	 * @param Aggregator $child
	 * @todo check against endless recursion
	 * @todo check if the group is already member of the group
	 * @todo add bidirectional association
	 */
	public function addAggregator(Aggregator $child) {
		$this->children->add($child);
	}

	public function removeAggregator(Aggregator $child) {
		$this->children->removeElement($child);
	}

	/**
	 * Adds channel as new child
	 *
	 * @param Channel $child
	 * @todo check if the channel is already member of the group
	 * @todo add bidrection association
	 */
	public function addChannel(Channel $child) {
		$this->channels->add($child);
	}

	public function removeChannel(Channel $child) {
		$this->channels->removeElement($child);
	}

	/**
	 * @todo return array via ArrayCollection::toArray()?
	 */
	public function getChannels() { return $this->channels; }
}

?>