<?php

class SelectAddonAction extends CartAction {
	
	public function execute($request) {
		
		sfContext::getInstance()->getConfiguration()->loadHelpers('I18N');
		
		$cartItem = $this->_cart->getCurrentItem();
		$purchases = $cartItem->getPurchases(true);
		
		if ($request->isMethod('post')) {
			
			$noOneAddonNames = array();
			$noOneAddonGroupNames = array();
			foreach ($purchases as $purchase) {
				$planId = $purchase->getPlanId();
				$plan = ResourceLocator::getInstance()->billingPlanService->getById($planId, $this->_store->getId());
				if ($addonGroupIds = $request->getParameter('addonGroups_' . $purchase->getId())) {
					foreach ($addonGroupIds as $addonGroupId) {
						$purchase->removeAddonByAddonGroupId($addonGroupId);
						$addonGroup = $plan->getAddonGroup($addonGroupId, $this->_store->getId(), $purchase->getCycleId());
						if ($addonGroup->multichoice()) {
							$selectedAddonsCount = 0;
							foreach ($addonGroup->getAddons() as $billingAddon) {
								if ($addonId = $request->getParameter('addons_' . $purchase->getId() . '_' . $addonGroupId . '_' . $billingAddon->getId())) {
									$cycleId = $purchase->getCycleId();
									$priceId = $request->getParameter('price_' . $addonId);
									$name = $billingAddon->productName;
									$type = $billingAddon->productType;
									$addon = new Addon($addonId, $planId, $cycleId, $priceId, $name, $type);
									$purchase->addAddon($addonGroupId, $addon);
									$selectedAddonsCount++;
								}
							}
							if (!$addonGroup->productAddonGroupNoneChoice && !$selectedAddonsCount) {
								$noOneAddonGroupNames[] = $addonGroup->productAddonGroupName;
							}
						} else {
							if ($addonId = $request->getParameter('addons_' . $purchase->getId() . '_' . $addonGroupId)) {
								$billingAddon = $addonGroup->getAddon($addonId);
								$cycleId = $purchase->getCycleId();
								$priceId = $request->getParameter('price_' . $addonId);
								$name = $billingAddon->productName;
								$type = $billingAddon->productType;
								$addon = new Addon($addonId, $planId, $cycleId, $priceId, $name, $type);
								$purchase->addAddon($addonGroupId, $addon);
							} else if(!$addonGroup->productAddonGroupNoneChoice) {
								$noOneAddonGroupNames[] = $addonGroup->productAddonGroupName;
							}
						}
					}
				}
				if ($plan->mustHaveAddons()) {
					if (!$result = $purchase->hasAddons()) {
						$noOneAddonNames[] = $purchase->getName();
					}
				}
			}
			if ($noOneAddonGroupNames) {
				sfContext::getInstance()->getUser()->setAttribute('errorMessage', __('TRANS_FOLLOWING_ADDON_GROUPS_MUST_HAVE_ADDONS', array('%NAMES%' => implode(', ', $noOneAddonGroupNames))));
			} else if ($noOneAddonNames) {
				sfContext::getInstance()->getUser()->setAttribute('errorMessage', __('TRANS_FOLLOWING_PLANS_MUST_HAVE_ADDONS', array('%NAMES%' => implode(', ', $noOneAddonNames))));
			} else {
				$this->_router->next();
			}
			
		}
		
		$purchaseAddonGroups = array();
		$selectedAddons = array();
		foreach ($purchases as $purchaseId => $purchase) {
			$purchasePlan = $this->_store->getPlan($purchase->getPlanId(), true);
			$price = $purchasePlan->getPriceById($purchase->getPriceId());
			$addonGroups = $purchasePlan->getAddonGroups($this->_store->getId(), $price->cycleID, true);
			if ($addonGroups) {
				$purchaseAddonGroups[$purchase->getId()] = $addonGroups;
				$selectedAddons[$purchase->getId()] = array();
				foreach ($addonGroups as $addonGroup) {
					$selectedAddons[$purchase->getId()][$addonGroup->getId()] = array();
					$addons = $addonGroup->getAddons();
					foreach ($addons as $addon) {
						if ($purchase->hasAddonByAddonId($addon->getId())) {
							$selectedAddons[$purchase->getId()][$addonGroup->getId()][$addon->getId()] = true;
							if (!$addonGroup->multichoice()) {
								break;
							}
						}
					}
					if (!$selectedAddons[$purchase->getId()][$addonGroup->getId()]) {
						foreach ($addons as $addon) {
							if ($addon->getId() == $addonGroup->defaultSelectedProductID) {
								$selectedAddons[$purchase->getId()][$addonGroup->getId()][$addon->getId()] = true;
								break;
							}
						}
					}
				}
			}
		}
		
		if (!$purchaseAddonGroups) {
			$this->_router->next(array(), false);
		}
		
		$plan = $this->_store->getPlan($cartItem->getPlanId(), true);
		
		$domains = array();
		if (!($plan instanceof BillingDomainPlan) && $cartItem->hasMasterPurchase()) {
			$plans = $this->_store->getPlans(true);
			foreach ($cartItem->getMasterPurchase()->getPurchases() as $purchase) {
				$planId = $purchase->getPlanId();
				if ($plans[$planId]->productType == BillingPlan::TYPE_DOMAIN) {
					$data = $purchase->getParameter('domainData');
					$domains[$data['name']] = $purchase->getParameter('type');
				}
			}
		}
		
		$this->plan = $plan;
		$this->domains = $domains;
		
		$this->purchases = $purchases;
		
		$this->purchaseAddonGroups = $purchaseAddonGroups;
		
		$this->selectedAddons = $selectedAddons;
		
		if ($defaultTaxZoneId = isset($this->_store->defaultTaxZoneID) ? $this->_store->defaultTaxZoneID : false) {
			$this->taxZone = ResourceLocator::getInstance()->billingTaxZoneService->getById($defaultTaxZoneId);
		}
		
		if ($this->errorMessage = sfContext::getInstance()->getUser()->getAttribute('errorMessage')) {
			sfContext::getInstance()->getUser()->setAttribute('errorMessage', null);
		}
		
	}
}