<?php

class Cart implements Resource {
	
	private $_items;
	
	private $_currentItem;
	
	private $_count;
	
	private $_domainPurchases;
	
	private $_sslCertificatePurchases;
	
	private $_parameters;
	
	public function __construct() {
		$this->_items = array();
		$this->_currentItem = null;
		$this->_count = 0;
		$this->_domainPurchases = array();
		$this->_sslCertificatePurchases = array();
		$this->_parameters = array();
	}
	
	public static function getInstance() {
		$container = sfContext::getInstance()->getUser()->getAttribute('container');
		$carts = sfContext::getInstance()->getUser()->getAttribute('carts');
		if (!isset($carts[$container])) {
			$carts[$container] = new Cart();
			sfContext::getInstance()->getUser()->setAttribute('carts', $carts);
		}
		return $carts[$container];
	}
	
	public function getItems() {
		return $this->_items;
	}
	
	public function getItem($id) {
		return isset($this->_items[$id]) ? $this->_items[$id] : null;
	}
	
	public function setCurrentItem(CartItem $item) {
		$this->_currentItem = $item;
	}
	
	public function getCurrentItem() {
		return $this->_currentItem;
	}
	
	public function attachCurrentItem() {
		if (!$this->currentItemAlreadyAttached()) {
			$this->_items[$this->_currentItem->getId()] = $this->_currentItem;
			return true;
		} else {
			return false;
		}
	}
	
	public function currentItemAlreadyAttached() {
		return isset($this->_items[$this->_currentItem->getId()]);
	}
	
	public function generateItemId() {
		return ++$this->_count;
	}
	
	public function generatePurchaseId() {
		return ++$this->_count;
	}
	
	public function generateAddonId() {
		return ++$this->_count;
	}
	
	public function generateFakeId() {
		return ++$this->_count;
	}
	
	public function getPurchase($purchaseId) {
		$result = null;
		foreach ($this->_items as $item) {
			if ($result = $item->getPurchase($purchaseId)) {
				break;
			}
		}
		return $result;
	}
	
	public function getPurchases() {
		$purchases = array();
		foreach ($this->_items as $cartItem) {
			foreach ($cartItem->getPurchases(true) as $purchase) {
				$purchases[$purchase->getId()] = $purchase;
			}
		}
		return $purchases;
	}
	
	public function getAddons() {
		$addons = array();
		foreach ($this->getPurchases() as $purchase) {
			foreach ($purchase->getAddons() as $addon) {
				$addons[$addon->getId()] = $addon;
			}
		}
		return $addons;
	}
	
	public function removePurchase($purchaseId) {
		foreach ($this->_items as $item) {
			$item->removePurchase($purchaseId);
		}
	}
	
	public function getDomainPurchases($withoutDataOnly = false, &$totalPurchasesCount = 0) {
		$purchases = array();
		foreach ($this->_items as $cartItem) {
			$purchases = array_merge($purchases, $cartItem->getPurchases(true));
		}
		$plans = sfContext::getInstance()->getUser()->getAttribute('store')->getPlans();
		$result = array();
		foreach ($purchases as $purchase) {
			$planId = $purchase->getPlanId();
			if ($plans[$planId]->productType == BillingPlan::TYPE_DOMAIN) {
				if ($withoutDataOnly && $purchase->getParameter('data')) {
					continue;
				}
				$totalPurchasesCount++;
				$result[$purchase->getId()] = $purchase;
			}
		}
		return $result;
	}
	
	public function getCertificatePurchasesAndAddons($withoutDataOnly = false, &$totalPurchasesCount = 0) {
		$store = sfContext::getInstance()->getUser()->getAttribute('store');
		$purchases = $this->getPurchases();
		$plans = $store->getPlans();
		$result = array();
		foreach ($purchases as $purchase) {
			$planId = $purchase->getPlanId();
			if ($plans[$planId]->productType == BillingPlan::TYPE_SSL_CERTIFICATE) {
				if ($withoutDataOnly && $purchase->getParameter('data')) {
					continue;
				}
				$totalPurchasesCount++;
				$result[$purchase->getId()] = $purchase;
			}
			foreach ($purchase->getCertificateAddons() as $addon) {
				if ($withoutDataOnly && $addon->getParameter('data')) {
					continue;
				}
				$totalPurchasesCount++;
				$result[$addon->getId()] = $addon;
			}
		}
		return $result;
	}
	
	public function getCoupons() {
		$coupons = array();
		foreach ($this->getPurchases() as $purchase) {
			if (($coupon = $purchase->getCoupon()) && !$coupon->preapplied()) {
				$coupons[$coupon->getId()] = $coupon;
			}
			foreach ($purchase->getAddons() as $addon) {
				if (($coupon = $addon->getCoupon()) && !$coupon->preapplied()) {
					$coupons[$coupon->getId()] = $coupon;
				}
			}
		}
		return $coupons;
	}
	
	public function addParameter($name, $value) {
		$this->_parameters[$name] = $value;
	}
	
	public function removeParameter($name) {
		if (isset($this->_parameters[$name])) {
			unset($this->_parameters[$name]);
		}
	}
	
	public function getParameter($name, $default = null) {
		return isset($this->_parameters[$name]) ? $this->_parameters[$name] : $default;
	}
	
	public function setParameter($name, $value) {
		if (isset($this->_parameters[$name])) {
			$this->_parameters[$name] = $value;
			return true;
		} else {
			return false;
		}
	}
	
	public function hasParameter($name) {
		return isset($this->_parameters[$name]) ? true : false;
	}
	
	public function clean() {
		$this->_items = array();
		$this->_currentItem = null;
		$this->_count = 0;
		$this->_domainPurchases = array();
		$this->_sslCertificatePurchases = array();
		$this->_parameters = array();
	}
	
}