<?php
require_once ("lib-action/action.php");

class EditPackageResponse extends MB_Action
{

	public function __construct()
    {
		parent::__construct();
		$this->stringRep = "EditPackageResponse";
		$this->params = array(
			"packageID", 
			"clientContactID", 
			"taxZoneGroupID", 
			"cycleDiscountGroupID", 
			"packageName", 
			"packageQuantity", 
			"packageProratable",
			"packageDateNextRenewal",
			"packageDateStopRenewal",
			"packageActive",
			"packageStatus",
			"packageComments",
			"packageType",
			"packagePrice",
			"packageDiscount",
			"packageSetup",
			"packagePriceLock",
			"packageCancellationType",
			"cycleID",
			"usageDateNextRenewal",
			"usageCycleID",
			"usageCalculateOnly",
			"couponNumCycles",
			"packageClientPermissions",
			"couponPrice",
		);
		$this->setupDateRequestArgs();
		$this->filterAmountArgs(array("packagePrice", "packageSetup", "couponPrice"));
		if ($_REQUEST["packageDateNextRenewalYear"])$this->reconstructDateRequest(array("packageDateNextRenewal"));
		if ($_REQUEST["usageDateNextRenewalYear"])$this->reconstructDateRequest(array("usageDateNextRenewal"));
		if ($_REQUEST["packageDateStopRenewalYear"])$this->reconstructDateRequest(array("packageDateStopRenewal"));
}

	public function execute()
    {
		parent::execute();
		$this->setReferralActionID(getActionID("EditPackage"));
		$this->setReferralActionFile("packages.php");

		do {
			if($this->err($packageID = $this->validateParam("packageID", INPUT_RESTRICTION_POSITIVE_INT|INPUT_RESTRICTION_REQUIRED), "No appropriate package ID given")) break;
			
			// if we are doing a server association then lets do that then redirect
			if ($_REQUEST["task"]=="serverassociate"){
				list($serverGroupID, $configGroupID) = explode("|", $_REQUEST["serverID"]);
				// get the attributes if they are there already
				$attributes = arrayFor(":packageAttributes", $x = array(
					"packageID" => $packageID,
					"comparisonOperator" => "=",
					"packageAttributeName" => array(
						"panel_status",
						"domainUserName",
					),
					"serverGroupID" => $serverGroupID,
				));
				$keyedAttributes = array();
				foreach ($attributes as $attr){
					$keyedAttributes[$attr["packageAttributeName"]] = $attr;
				}
				
				if ($keyedAttributes["panel_status"]){
					updateForKey(":packageAttributes", $keyedAttributes["panel_status"]["packageAttributeID"], array(
						"configGroupID" => $configGroupID,
					));
				} else {
					insertFor(":packageAttributes", array(
						"packageID" => $packageID,
						"serverGroupID" => $serverGroupID,
						"configGroupID" => $configGroupID,
						"packageAttributeName" => "panel_status",
						"packageAttributeValue" => "none",
						"packageAttributeDateCreated" => time(),
					));
				}
				
				if ($_REQUEST["domainUserName"]){
					if ($keyedAttributes["domainUserName"]){
						updateForKey(":packageAttributes", $keyedAttributes["domainUserName"]["packageAttributeID"], array(
							"configGroupID" => $configGroupID,
							"packageAttributeValue" => $_REQUEST["domainUserName"],
						));
					} else {
						insertFor(":packageAttributes", array(
							"packageID" => $packageID,
							"serverGroupID" => $serverGroupID,
							"configGroupID" => $configGroupID,
							"packageAttributeName" => "domainUserName",
							"packageAttributeValue" => $_REQUEST["domainUserName"],
							"packageAttributeDateCreated" => time(),
						));
					}
				}
				
				$ids = IDsOf("packageAttributes", array(
					"packageID" => $packageID,
					"serverGroupID" => $serverGroupID,
				));
				updateFor("packageAttributes", array(
					"packageAttributeID" => $ids,
					"configGroupID" => $configGroupID,
					"serverGroupID" => $serverGroupID,
				));
				
				redirect("packages.php", "ShowPackageDetails", array(
					"packageID" => $packageID,
				));
				break;
			} elseif ($_REQUEST["task"]=="panelAction") {
				if ($_REQUEST["panelAction"]){
					$cmd = "<mbapi>
	<command>ProcessPanel</command>
	<subCommand>".$_REQUEST["panelAction"]."</subCommand>
	<params>
		<subCommand>".$_REQUEST["panelAction"]."</subCommand>
		<configGroupID>".((int)$_REQUEST["configGroupID"])."</configGroupID>
		<serverGroupID>".((int)$_REQUEST["serverGroupID"])."</serverGroupID>
		<packageID>".((int)$_REQUEST["packageID"])."</packageID>
	</params>
</mbapi>";
					$timeData = explode(";", date("i;G;j;n;Y"));
					dispatchMBAPI(array(
						"mbapi" => array(
							"command" => "SetSystemQueue",
							"subCommand" => "insert",
							"params" => array(
								"systemQueueCommand" => "ProcessPanel",
								"systemQueueCommandInput" => utf8_xml_entity_encode($cmd),
								"systemQueueMinute" => $timeData[0],
								"systemQueueHour" => $timeData[1],
								"systemQueueDay" => $timeData[2],
								"systemQueueMonth" => $timeData[3],
								"systemQueueYear" => $timeData[4],
								"systemQueueIsRecurring" => 0,
								"systemQueueDateCreated" => time(),
								"systemQueueDateToRun" => time(),
								"systemQueueDateStarted" => 0,
								"systemQueueDateFinished" => 0,
								"serverGroupID" => (int)$_REQUEST["serverGroupID"],
								"configGroupID" => (int)$_REQUEST["configGroupID"],
								"packageID" => $packageID
							),
						),
					));
				}
				redirect("packages.php", "ShowPackageDetails", array(
					"packageID" => $packageID,
				));
				break;
			}
			
			$configGroupID = $this->validateParam("configGroupID", INPUT_RESTRICTION_POSITIVE_INT|INPUT_RESTRICTION_REQUIRED);
			if($this->err($configGroupID)) {
				

				$packageQuery = new MBQuery(
					"GetPackages", "",
					array(
						"packageID" => $packageID,
						"getPackageAttributeData" => 1,
						"getPackageAddonData" => 1,
						"getDomainData" => 1,
					)
				);
				if(!$this->addErrorsFromResult($packageResult =& $packageQuery->getResult())) break;
				
				// base editing
				$this->invalidParams = array();
			
				$params = array();
				dbg("before it");
				dbg($_REQUEST);
				if (isset($_REQUEST["packageActive"]))$params["packageActive"] = $this->validateParam("packageActive", INPUT_RESTRICTION_BOOL);
				if (isset($_REQUEST["cycleID"]))$params["cycleID"] = $this->validateParam("cycleID", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["clientContactID"]))$params["clientContactID"] = $this->validateParam("clientContactID", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packageStatus"]))$params["packageStatus"] = $this->validateParam("packageStatus", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packageStatusReason"]))$params["packageStatusReason"] = $this->validateParam("packageStatusReason", INPUT_RESTRICTION_STRING);
				if (isset($_REQUEST["packageName"]))$params["packageName"] = $this->validateParam("packageName", INPUT_RESTRICTION_STRING);
				if (isset($_REQUEST["taxZoneGroupID"]))$params["taxZoneGroupID"] = $this->validateParam("taxZoneGroupID", INPUT_RESTRICTION_NULL);
				if (isset($_REQUEST["cycleDiscountGroupID"]))$params["cycleDiscountGroupID"] = $this->validateParam("cycleDiscountGroupID", INPUT_RESTRICTION_NULL);
				if (isset($_REQUEST["packageQuantity"]))$params["packageQuantity"] = $this->validateParam("packageQuantity", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packageProratable"]))$params["packageProratable"] = $this->validateParam("packageProratable", INPUT_RESTRICTION_BOOL);
				if (isset($_REQUEST["packagePriceLock"]))$params["packagePriceLock"] = $this->validateParam("packagePriceLock", INPUT_RESTRICTION_BOOL);
				if (isset($_REQUEST["packageComments"]))$params["packageComments"] = $this->validateParam("packageComments", INPUT_RESTRICTION_STRING);
				if (isset($_REQUEST["packageType"]))$params["packageType"] = $this->validateParam("packageType", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packagePrice"]))$params["packagePrice"] = $this->validateParam("packagePrice", INPUT_RESTRICTION_DOUBLE);
				if (isset($_REQUEST["packageDiscount"]))$params["packageDiscount"] = $this->validateParam("packageDiscount", INPUT_RESTRICTION_DOUBLE);
				if (isset($_REQUEST["packageSetup"]))$params["packageSetup"] = $this->validateParam("packageSetup", INPUT_RESTRICTION_DOUBLE);
				if (isset($_REQUEST["couponPrice"]))$params["couponPrice"] = $this->validateParam("couponPrice", INPUT_RESTRICTION_DOUBLE);
				if (isset($_REQUEST["packageDateNextRenewal"]))$params["packageDateNextRenewal"] = $this->validateParam("packageDateNextRenewal", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packageDateStopRenewalChecked"]) && (int)$_REQUEST["packageDateStopRenewalChecked"]){
					if (isset($_REQUEST["packageDateStopRenewal"]))$params["packageDateStopRenewal"] = $this->validateParam("packageDateStopRenewal", INPUT_RESTRICTION_INT);
				} elseif (isset($_REQUEST["packageDateStopRenewalChecked"]) && !(int)$_REQUEST["packageDateStopRenewalChecked"]){
					$params["packageDateStopRenewal"] = 0;
				}
				if (isset($_REQUEST["usageDateNextRenewalChecked"]) && (int)$_REQUEST["usageDateNextRenewalChecked"]){
					if (isset($_REQUEST["usageDateNextRenewal"]))$params["usageDateNextRenewal"] = $this->validateParam("usageDateNextRenewal", INPUT_RESTRICTION_INT);
				} elseif (isset($_REQUEST["usageDateNextRenewalChecked"]) && !(int)$_REQUEST["usageDateNextRenewalChecked"]){
					$params["usageDateNextRenewal"] = 0;
				}
				if (isset($_REQUEST["couponNumCycles"]))$params["couponNumCycles"] = $this->validateParam("couponNumCycles", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["usageCycleID"]))$params["usageCycleID"] = $this->validateParam("usageCycleID", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["usageCalculateOnly"]))$params["usageCalculateOnly"] = $this->validateParam("usageCalculateOnly", INPUT_RESTRICTION_BOOL);
				if (isset($_REQUEST["packagePendingCancellation"]))$params["packagePendingCancellation"] = $this->validateParam("packagePendingCancellation", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packageClientPermissions"]))$params["packageClientPermissions"] = $this->validateParam("packageClientPermissions", INPUT_RESTRICTION_INT);
				if (isset($_REQUEST["packageCancellationType"]))$params["packageCancellationType"] = $this->validateParam("packageCancellationType", INPUT_RESTRICTION_INT);

				if (count($this->invalidParams)){
					dbg("Doing validation redirect");
					$this->validationRedirect(array("packageID" => (int)$_REQUEST["packageID"]));
					break;
				} else {
					dbg('Update subscription with id = ' . $packageID);
					dbg($params);
                    
                    $this->_subscription = Factory()->Package($packageID);
                    $this->_changePrimaryDomain();
					
					if (isset($params["packageActive"])) {
						$this->_subscription->package_active = $params["packageActive"];
					}
					if (isset($params["packageStatus"])) {
						$this->_subscription->package_status = $params["packageStatus"];
					}
					require_once("object_managers/PackageManager.php");
					PackageManager::update($this->_subscription);
					
					// issue invoice-factura, if needed
					if (Package::STATUS_CANCELED == $this->_subscription->package_status || Package::STATUS_COMPLETED == $this->_subscription->package_status) {
						require_once("object_managers/InvoiceFacturaManager.php");
						InvoiceFacturaManager::createSingleFactura($this->_subscription->id);
					}
					
					// update generic properties of subscription
					$params["packageID"] = $packageID;
					updateFor("packagesGeneric", $params);
				}

			} else {
				// panel editing
				
				if($this->err($selectedPanelStatus = $this->validateParam("packageStatus", INPUT_RESTRICTION_UNSIGNED_INT|INPUT_RESTRICTION_REQUIRED), "No appropriate package status ID given")) break;

				$packageQuery = new MBQuery(
					"GetPackages", "",
					array(
						"packageID" => $packageID,
						"getPackageAttributeData" => 1,

					)
				);
				if(!$this->addErrorsFromResult($packageResult =& $packageQuery->getResult())) break;
				$packageAttributeTable =& $packageResult->getTableFrom(
					array("mbapi", "results", "packages", "package", "packageAttributes", "packageAttribute"),
					"packageAttributeName", "packageAttributeValue"
				);
				$packageAttributes = $packageAttributeTable->getTable();
				$configGroupPackageAttributeTables =& $packageAttributeTable->getAssociatedTablesBy("configGroupID");
				$ourPackageAttributeTable =& $configGroupPackageAttributeTables[$configGroupID];
				$panelAttributes = $ourPackageAttributeTable->getOptions();
				$panelStatus = $panelAttributes["panel_status"];
				$panelStatusID = getAPIStatusID("package", $panelStatus);
				
				//echo '<pre>';
				if($panelStatusID != $selectedPanelStatus) {
					require_once("objects/Package.php");
					
					$subCommand = "";
					switch($selectedPanelStatus) {
						case Package::STATUS_ACTIVE:
							$subCommand = "panelUnsuspend";
							break;
						case Package::STATUS_SUSPENDED :
							$subCommand = "panelSuspend";
							break;
						case Package::STATUS_CANCELED : 
							$subCommand = "panelDelete";
							break;
					}
					
					

					$panelQuery = new MBQuery(
						"ProcessPanel", $subCommand,
						array(
							'subCommand' => $subCommand,
							'configGroupID' => $configGroupID,
							'packageID' => $packageID,
						)
					);
					$panelXML = $panelQuery->getXMLQuery();

					$panelQuery = new MBQuery(
						"SetSystemQueue", "insert",
						array(
							"systemQueueCommand" => "ProcessPanel",
							"configGroupID" => $configGroupID,
							"packageID" => $packageID,
							"systemQueueCommandInput" => htmlentities($panelXML),
							"systemQueueDateToRun" => mktime(),
							"systemQueueDateFinished" => 0,
						)
					);

					if(!$this->addErrorsFromResult($panelResult =& $panelQuery->getResult())) break;				
				}
			}

			if(!$this->goBack()) redirect("packages.php", getActionID("EditPackage"), array("packageID" => $packageID));
		} while(false);

		$this->addErrorTemplates();
		return $this->hasExecutedSuccessfully();
	}

    private function _changePrimaryDomain()
    {
        $selectedAdditionalOperation = bgpc("packageDomainID_operation");
        $transaction = new DBTransaction(DatabaseManager::getConnection());
        if ($selectedPackageDomainId = bgpc("packageDomainID")) {
            $this->_subscription->primary_domain_id = $selectedPackageDomainId;
            if (!in_array($selectedPackageDomainId, $this->_subscription->packageDomainIDs)) {
                $this->_subscription->packageDomainIDs = array_merge($this->_subscription->packageDomainIDs, array($selectedPackageDomainId));
            }
        } else {
        	$this->_subscription->primary_domain_id = null;
        }
		switch($selectedAdditionalOperation) {
			case "add" :
				$newDomainSld = bgpc("packageDomainID_newDomainSLD");
        		$newDomainTld = bgpc("packageDomainID_newDomainTLD");
				if (!strlen($newDomainSld) || !strlen($newDomainTld)) {
					$this->_displayError(blmsg('TRANS_SUBSCRIPTION_ADMIN_EDIT_DOMAIN_ADD_EMPTY'));
					break;
				}
				$domain = $this->_getUserDomain($newDomainSld, $newDomainTld);
				if (in_array($domain->domain_id, $this->_subscription->packageDomainIDs)) {
					$this->_displayError(blmsg('TRANS_SUBSCRIPTION_ADMIN_EDIT_DOMAIN_ADD_EXISTENT', array('DOMAIN' => $domain->name)));
					break;
				}
				if (!in_array($domain->domain_id, $this->_subscription->packageDomainIDs)) {
					$this->_subscription->packageDomainIDs = array_merge($this->_subscription->packageDomainIDs, array($domain->domain_id));
				}
				break;
			case "replace" :
				$replaceDomain = Factory()->PackageDomain(bgpc("packageDomainID_replaceDomainID"));
				if (!in_array($this->_subscription->id, $replaceDomain->packageIDs)) {
					$this->_displayError(blmsg('TRANS_SUBSCRIPTION_ADMIN_EDIT_DOMAIN_REPLACE_FOREIGN', array('DOMAIN' => $replaceDomain->name)));
					break;
				}
				$newDomainSld = bgpc("packageDomainID_replaceDomainSLD");
        		$newDomainTld = bgpc("packageDomainID_replaceDomainTLD");
        		if (!strlen($newDomainSld) || !strlen($newDomainTld)) {
        			$this->_displayError(blmsg('TRANS_SUBSCRIPTION_ADMIN_EDIT_DOMAIN_REPLACE_EMPTY'));
					break;
				}
				$domain = $this->_getUserDomain($newDomainSld, $newDomainTld);
				if (in_array($domain->domain_id, $this->_subscription->packageDomainIDs)) {
					$this->_displayError(blmsg('TRANS_SUBSCRIPTION_ADMIN_EDIT_DOMAIN_REPLACE_EXISTENT', array('DOMAIN1' => $replaceDomain->name, 'DOMAIN2' => $domain->name)));
					break;
				}
				
				if ($replaceDomain->id == $selectedPackageDomainId) {
					$this->_subscription->primary_domain_id = $domain->domain_id;
				}
				
				$this->_subscription->packageDomainIDs = array_merge($this->_subscription->packageDomainIDs, array($domain->domain_id));
				$this->_subscription->packageDomainIDs = array_diff($this->_subscription->packageDomainIDs, array($replaceDomain->id));
				
				// delete domain, if is connected only with this subscription
				if(1 == count($replaceDomain->packageIDs)) {
					$replaceDomain->delete();
				}
				
				break;
			case "remove" :
				$removeDomain = Factory()->PackageDomain(bgpc("packageDomainID_removeDomainID"));
				if (!in_array($this->_subscription->id, $removeDomain->packageIDs)) {
					$this->_displayError(blmsg('TRANS_SUBSCRIPTION_ADMIN_EDIT_DOMAIN_REMOVE_FOREIGN', array('DOMAIN' => $removeDomain->name)));
					break;
				}
				if ($selectedPackageDomainId == $removeDomain->id) {
					$this->_displayError(blmsg('TRANS_SUBSCRIPTION_DOMAIN_REMOVAL_FORBIDDEN_MSG'));
					break;
				}
				
				$this->_subscription->packageDomainIDs = array_diff($this->_subscription->packageDomainIDs, array($removeDomain->id));
				
				// delete domain, if is connected only with this subscription
				if (1 == count($removeDomain->packageIDs)) {
					$removeDomain->delete();
				}
				break;
		}

		$transaction->commit();
    }

    private function _getUserDomain($domainSld, $domainTld)
    {
        $subscriptions = Factory()->PackageList(array('client_id' => $this->_subscription->client_id));
        foreach ($subscriptions as $subscription) {
            foreach ($subscription->PackageDomainList() as $domain) {
                if (($domainSld == $domain->domain_sld) && ($domain->domain_tld == $domainTld)) {
                    return $domain;
                }
            }
        }
        
        $domain = Factory()->PackageDomain();
		$domain->domain_sld = $domainSld;
		$domain->domain_tld = $domainTld;
		$domain->domain_idn_language = "en";
		$domain->update();
		return $domain;
    }
    
    private function _displayError($message)
    {
    	billing_put_error($message);
    	redirect_url(action_url('packages', 'EditPackage', array('packageID' => $this->_subscription->id)));
    }

    private $_subscription;
}