<?php

require_once("lib-action/action.php");

class EditPackage extends MB_Action
{
	public $params = array("packageID");

	public function execute()
	{
		global $CONF;
		parent::execute();

		// fake exception handling for php4
		do {
			if($this->err($packageID = getParam("packageID"), "No package ID given.")) break;

			$packageQuery = new MBQuery(
				"GetPackages", "",
				array(
					"packageID" => $packageID,
					"getPackageAttributeData" => 1,
					"getPackageAddonData" => 1,
					"getDomainData" => 1,
				)
			);
			if(!$this->addErrorsFromResult($packageResult =& $packageQuery->getResult())) break;
			$packageTable =& $packageResult->getTableFrom(
				array("mbapi", "results", "packages", "package", 0),
				"packageID", "packageName"
			);
			dbg($packageResult);
			$package = $packageTable->getOne();
            $this->_subscription = Factory()->Package($packageID);
			$package["packageDomainID"] = $this->_subscription->primary_domain_id;

			$packageAttributeTable =& $packageResult->getTableFrom(
				array("mbapi", "results", "packages", "package", "packageAttributes", "packageAttribute"),
				"packageAttributeName", "packageAttributeValue"
			);
			$packageAttributes = $packageAttributeTable->getTable();
			$panelPackageAttributeTables =& $packageAttributeTable->getAssociatedTablesBy("configGroupID");

			$packageAddons = $packageResult->getEssentialFrom(
				array("mbapi", "results", "packages", "package", "packageAddons", "packageAddon")
			);
			dbg($packageAddons);

			$package["canTransfer"] = $this->_subscription->canTransfer();
			$package["canUpgrade"] = $this->_subscription->canUpgrade();
			$package["canDowngrade"] = $this->_subscription->canDowngrade();

			$serverTable =& $this->getServerTable();
			$serverTablesByConfigGroupID =& $serverTable->getAssociatedTables();

			$panelDetails = array();
			foreach($panelPackageAttributeTables as $configGroupID => $configGroupAttributeTable) {
				if(!isset($serverTablesByConfigGroupID[$configGroupID])) {
					continue;
				}
				$servers =& $serverTablesByConfigGroupID[$configGroupID]->getOne();
				$serverAttributes = $configGroupAttributeTable->getOptions();
				$panelStatus = isset($serverAttributes['panel_status']) ? $serverAttributes['panel_status'] : 'none';
				$statusID = getAPIStatusID("package", $panelStatus);
				$statusName = getStatusName("package", $statusID);

				$panelDetails[] = array(
					'servername' => $servers['moduleDisplayName'],
					'configGroupID' => $configGroupID,
					'panel' => $servers['panelName'],
					'statusID' => $statusID,
					'status' => $statusName,
				);
			}

			$this->smartyVars["client"] = correctArray(grabFirstResultFromMBAPIArray(array(
				"mbapi" => array(
					"command" => "GetClients",
					"params" => array(
						"clientID" => $package["clientID"],
						"mergePrimaryContact" => 1,
					),
				),
			)));

			$packageStatuses = getStatuses("package");
			$panelStatuses = array();
			foreach($packageStatuses as $statusID => $statusName) {
				switch($statusName) {
					case TRANS_ACTIVE:
						$panelStatuses[$statusID] = $statusName;
						break;
					case TRANS_CANCELED:
						$panelStatuses[$statusID] = $statusName;
						break;
					case TRANS_SUSPENDED:
						$panelStatuses[$statusID] = $statusName;
						break;
				}
			}


			/** AUTO GENERATE FORM DATA BEGIN **/
			$this->smartyVars["editForm"] = new MBAutoFormFields();
			$this->smartyVars["editForm"]->addFields(array(

				"TRANS_PACKAGE_DETAILS" => array("titleRow","TRANS_PACKAGE_DETAILS"),
				"packageActive" => array("checkbox", "TRANS_RECORD_IS_ACTIVE"),
				"clientContactID" => array("select", "TRANS_BILL_TO_SPECIFIC_CONTACT"),
				"packageType" => array("text", "TRANS_PRODUCT_TYPE"),
				"packageName" => array("text", "TRANS_PRODUCT_NAME"),
				"packageQuantity" => array("text", "TRANS_PRODUCT_QUANTITY"),
				"packageDisableAccountStacking" => array("select", "TRANS_ACCOUNT_STACKING"),
				"packageDomainID" => array("select", "TRANS_ASSOCIATED_DOMAINS"),
				"packageComments" => array("textarea", "TRANS_PACKAGE_COMMENTS"),

				"TRANS_PACKAGE_STATUS_OPTIONS" => array("titleRow","TRANS_PACKAGE_STATUS_OPTIONS"),
				"packageStatus" => array("select", "TRANS_CURRENT_PACKAGE_STATUS"),
				"packageStatusReason" => array("textarea", "TRANS_STATUS_CHANGE_REASON"),

				"TRANS_PACKAGE_CANCELLATION_OPTIONS" => array("titleRow","TRANS_PACKAGE_CANCELLATION_OPTIONS"),
				"packageCancellationType" => array("select", "TRANS_CANCELLATION_RULES"),
				"packagePendingCancellation" => array("select", "TRANS_CURRENT_CANCELLATION_ACTION"),

				"TRANS_PACKAGE_PRICE_SETTINGS" => array("titleRow","TRANS_PACKAGE_PRICE_SETTINGS"),
				"packageOriginalPrice" => array("text", "TRANS_ORIGINAL_PRICE"),
				"packagePrice" => array("text", "TRANS_CURRENT_PRICE"),
				"packageSetup" => array("text", "TRANS_SETUP_PRICE"),
				"packageDiscount" => array("text", "TRANS_DISCOUNT_PERCENTAGE"),
				"packageProratable" => array("checkbox", "TRANS_PACKAGE_IS_PRORATABLE"),
				"packagePriceLock" => array("checkbox", "TRANS_PACKAGE_PRICE_LOCKING_ENABLED"),
				"taxZoneGroupID" => array("select", "TRANS_TAX_ZONE_GROUP"),
				"cycleDiscountGroupID" => array("select", "TRANS_CYCLE_DISCOUNT_GROUP"),

				"TRANS_COUPON_OPTIONS" => array("titleRow","TRANS_PACKAGE_COUPON_OPTIONS"),
				"couponPrice" => array("text", "TRANS_COUPON_PRICE"),
				"couponNumCycles" => array("text", "TRANS_COUPON_NUM_CYCLES"),

				"TRANS_USAGE_RENEWAL_DATES" => array("titleRow","TRANS_USAGE_RENEWAL_DATES"),
				"usageCycleID" => array("select", "TRANS_USAGE_CYCLE"),
				"usageCalculateOnly" => array("checkbox", "TRANS_USAGE_CALCULATE_ONLY"),
				"usageDateLastRenewal" => array("dateselect", "TRANS_USAGE_DATE_LAST_RENEWAL"),
				"usageDateNextRenewal" => array("dateselect", "TRANS_USAGE_DATE_NEXT_RENEWAL"),

				"TRANS_GENERAL_RENEWAL_DATES" => array("titleRow","TRANS_GENERAL_RENEWAL_DATES"),
				"cycleID" => array("select", "TRANS_BILLING_CYCLE"),
				"packageDateLastRenewal" => array("dateselect", "TRANS_PACKAGE_DATE_LAST_RENEWAL"),
				"packageDateNextRenewal" => array("dateselect", "TRANS_PACKAGE_DATE_NEXT_RENEWAL"),
				"packageDateStopRenewal" => array("dateselect", "TRANS_PACKAGE_DATE_STOP_RENEWAL"),

				"TRANS_SYSTEM_RULES_AND_PERMISSIONS" => array("titleRow","TRANS_SYSTEM_RULES_AND_PERMISSIONS"),
				"packageClientPermissions" => array("select", "TRANS_PACKAGE_CLIENT_PERMISSIONS"),

			));

			$this->smartyVars["editForm"]->setFieldData("usageDateNextRenewal", "params", array("startYear" => date("Y")));
			$this->smartyVars["editForm"]->setFieldData("packageDateNextRenewal", "params", array("startYear" => date("Y")));
			$this->smartyVars["editForm"]->setFieldData("packageDateStopRenewal", "params", array("startYear" => date("Y")));

			$this->smartyVars["editForm"]->addHiddenFields(array(
				"packageID" => $package["packageID"],
			));
            
			$this->smartyVars["editForm"]->setFieldData("packageDomainID", "addDomainField", 1);
			$this->smartyVars["editForm"]->setFieldData("packageDomainID", "allowBlankChoice", 1);
			
			$this->smartyVars["editForm"]->setFieldData("packageStatus", "helpTitle", TRANS_WARNING);
			$this->smartyVars["editForm"]->setFieldData("packageStatus", "helpText", TRANS_SETTING_STATUS_TO_CANCELED_WARNING);

			$this->smartyVars["editForm"]->setFieldData("packageDiscount", "helpTitle", TRANS_WARNING);
			$this->smartyVars["editForm"]->setFieldData("packageDiscount", "helpText", TRANS_SETTING_DISCOUNT_WARNING);

			$this->smartyVars["editForm"]->setFieldData("packageDisableAccountStacking", "helpTitle", TRANS_WARNING);
			$this->smartyVars["editForm"]->setFieldData("packageDisableAccountStacking", "helpText", TRANS_SETTING_STACKING_WARNING);

			$this->smartyVars["editForm"]->setFieldData("usageCycleID", "allowBlankChoice", 1);
			$this->smartyVars["editForm"]->setFieldData("taxZoneGroupID", "allowBlankChoice", 1);
			$this->smartyVars["editForm"]->setFieldData("cycleDiscountGroupID", "allowBlankChoice", 1);

			$this->smartyVars["editForm"]->setFieldData("packagePrice", "currencyID", $package["currencyID"]);
			$this->smartyVars["editForm"]->setFieldData("packageSetup", "currencyID", $package["currencyID"]);
			$this->smartyVars["editForm"]->setFieldData("packageOriginalPrice", "currencyID", $package["currencyID"]);
			$this->smartyVars["editForm"]->setFieldData("couponPrice", "currencyID", $package["currencyID"]);

			require_once("objects/Product.php");
			$packageTypes = blmsg_array(Product::types($this->_isReseller()));
			$package["packageType"] = $packageTypes[$package["packageType"]];
			$this->smartyVars["editForm"]->addDataFromSource($package);

			$this->smartyVars["editForm"]->setDateOptional("packageDateStopRenewal");
			$this->smartyVars["editForm"]->setDateOptional("usageDateNextRenewal");

			$this->smartyVars["editForm"]->setShowOnly(array(
				"packageType",
				"packageDateLastRenewal",
				"packageOriginalPrice",
				"usageDateLastRenewal",
			));

			$contacts = arrayFor("contacts", array(
				"clientID" => $package["clientID"],
			));

			$contactChoices = array("0" => "");
			foreach ($contacts as $cc){
				$contactChoices[$cc["clientContactID"]] = billing_get_full_name($cc["contactFirstName"], $cc["contactLastName"]);
			}

			$this->smartyVars["editForm"]->setSelectable("packageDisableAccountStacking", array(
				'1' => TRANS_STACKING_PER_SERVER,
				'0' => TRANS_DISABLE_STACKING,
			));
			$this->smartyVars["editForm"]->setSelectable("clientContactID", $contactChoices);
			$this->smartyVars["editForm"]->setSelectable("taxZoneGroupID", grabHTMLOpsFromArray(
						grabSimpleMBAPIResults(dispatchMBAPI("<mbapi><command>GetTaxZoneGroups</command></mbapi>", 1)),
						"taxZoneGroupID",
						"taxZoneGroupName"));
			$this->smartyVars["editForm"]->setSelectable("cycleDiscountGroupID", optionsFor(':cycleDiscountGroups', array(
				'cycleDiscountGroupActive' => 1,
			))+(
				$package['cycleDiscountGroupID'] ?
				array(
					$package['cycleDiscountGroupID'] => TRANS_CURRENT,
				) :
				array()
			));

			$this->smartyVars["editForm"]->setSelectable("packageDomainID", $this->_getClientDomains());
			$this->smartyVars["editForm"]->setSelectable("packageStatus", getStatuses("package"));
			$this->smartyVars["editForm"]->setSelectable("packageClientPermissions", getTypes("packagemanagement"));
			$this->smartyVars["editForm"]->setSelectable("cycleID", getCyclesArray());
			$this->smartyVars["editForm"]->setSelectable("usageCycleID", getCyclesArray());
			$this->smartyVars["editForm"]->setSelectable("packageCancellationType", getTypes("cancellation"));
			$this->smartyVars["editForm"]->setSelectable("packagePendingCancellation", getTypes("pendingcancellation"));

			$this->smartyVars["editForm"] = $this->smartyVars["editForm"]->getData();

			/** AUTO GENERATED EDIT FORM DATA END **/

			$tmp = explode(";", $CONF["user"]["locale"]->localeArray["locale_pattern_currency"]);
			$tmp[0] = ereg_replace("^¤#0.00", "¤#,##0.00", $tmp[0]);
			$tmp[1] = ereg_replace("^¤#0.00", "¤#,##0.00", $tmp[1]);
			if (!$tmp[1])$tmp[1] = $tmp[0];
			$CONF["user"]["locale"]->localeArray["locale_pattern_currency"] = $tmp[0].";".$tmp[1];
 			$this->smartyVars["localeArray"] =  $CONF["user"]["locale"]->localeArray;

			$this->smartyVars['package'] = $package;
			$this->smartyVars['packageStatuses'] = $packageStatuses;
			$this->smartyVars['panelStatuses'] = $panelStatuses;
			$this->smartyVars['types'] = getTypes("products");
			$this->smartyVars['packageAttributes'] = $packageAttributes;
			$this->smartyVars['panelDetails'] = $panelDetails;

			$defaults = $package;

			$this->mergeFormState($defaults);
			$this->addTemplate("packages/EditPackage");
		} while (false);

		$this->addErrorTemplates();
		return $this->hasExecutedSuccessfully();
	}

    private function _getClientDomains()
    {
        $clientDomains = array();
        $subscriptions = Factory()->PackageList(array('client_id' => $this->_subscription->client_id));
        foreach ($subscriptions as $subscription) {
            foreach ($subscription->PackageDomainList() as $domain) {
                $clientDomains[$domain->domain_id] = $domain->name;
            }
        }
        return $clientDomains;
    }

    private $_subscription;
}
