/**
 * Client area output logic handling.
 *
 * This function is used to define module specific client area output. It should
 * return an array consisting of a template file and optional additional
 * template variables to make available to that template.
 *
 * The template file you return can be one of two types:
 *
 * * tabOverviewModuleOutputTemplate - The output of the template provided here
 *   will be displayed as part of the default product/service client area
 *   product overview page.
 *
 * * tabOverviewReplacementTemplate - Alternatively using this option allows you
 *   to entirely take control of the product/service overview page within the
 *   client area.
 *
 * Whichever option you choose, extra template variables are defined in the same
 * way. This demonstrates the use of the full replacement.
 *
 * Please Note: Using tabOverviewReplacementTemplate means you should display
 * the standard information such as pricing and billing details in your custom
 * template or they will not be visible to the end user.
 *
 * @param array $params common module parameters
 *
 * @see http://docs.whmcs.com/Provisioning_Module_SDK_Parameters
 *
 * @return array
 */
function budgetvm_ClientArea(array $params)
{
    // Determine the requested action and set service call parameters based on
    // the action.
    $requestedAction = isset($_REQUEST['customAction']) ? $_REQUEST['customAction'] : '';
    $service = $params['serviceid'];
    $bvmid = $params['customfields']['BudgetVM Service ID'];
    $var = new stdclass();
    $var->post = new stdclass();
    $var->post->service = $bvmid;
    $budgetvm->bvmid = $bvmid;
    $budgetvm->service = $service;
    $type = new BudgetVM_Api($params['serverpassword']);
    $type = $type->call("v2", "device", "type", "get", $var);
    $budgetvm->type = $type->result;
    if ($requestedAction == "manage") {
        $serviceAction = 'get_usage';
        $templateFile = 'templates/manage.tpl';
    } elseif ($requestedAction == 'reverse') {
        if ($_SERVER['REQUEST_METHOD'] == "POST" && is_array($_POST['update'])) {
            $update = new BudgetVM_Api($params['serverpassword']);
            $var->post->records = json_encode($_POST['update']);
            $budgetvm->return = $update->call("v2", "dns", "reverse", "put", $var);
            if (is_object($budgetvm->return->result)) {
                $fixed = "";
                foreach ($budgetvm->return->result as $ip => $ret) {
                    $fixed .= $ip . " - " . $ret . "<br>" . PHP_EOL;
                }
                $budgetvm->return->result = $fixed;
            }
        } else {
            $budgetvm->return = NULL;
        }
        $netblocks = new BudgetVM_Api($params['serverpassword']);
        $budgetvm->netblocks = $netblocks->call("v2", "network", "netblock", "get", $var);
        $serviceAction = 'get_usage';
        $templateFile = 'templates/rdns.tpl';
    } elseif ($requestedAction == 'network') {
        $bandwidth = new BudgetVM_Api($params['serverpassword']);
        if ($budgetvm->type == "dedicated") {
            if (isset($_GET['period'])) {
                switch ($_GET['period']) {
                    case "hour":
                        $var->post->start = strtotime("-1 hour");
                        break;
                    case "day":
                        $var->post->start = strtotime("-1 day");
                        break;
                    case "week":
                        $var->post->start = strtotime("-1 week");
                        break;
                    case "month":
                        $var->post->start = strtotime("-1 month");
                        break;
                    case "year":
                        $var->post->start = strtotime("-1 year");
                        break;
                    default:
                        $var->post->start = strtotime("-1 month");
                        break;
                }
            } else {
                $var->post->start = strtotime("last Month");
            }
            $var->post->end = strtotime("now");
            $budgetvm->bandwidth = $bandwidth->call("v2", "network", "bandwidth", "post", $var);
        } else {
            $budgetvm->bandwidth = $bandwidth->call("v2", "network", "bandwidth", "post", $var);
        }
        $serviceAction = 'get_usage';
        $templateFile = 'templates/network.tpl';
    } elseif ($requestedAction == 'power') {
        if ($_SERVER['REQUEST_METHOD'] == "POST") {
            if ($_POST['bootorder'] != "standard") {
                // Custom Boot Order was Requested
                $bootorder = new BudgetVM_Api($params['serverpassword']);
                $var->post->request = $_POST['bootorder'];
                $budgetvm->bootorder = $bootorder->call("v2", "device", "power", "put", $var);
            } else {
                $budgetvm->bootorder = NULL;
            }
            // Power Action
            $update = new BudgetVM_Api($params['serverpassword']);
            $var->post->action = $_POST['poweraction'];
            $budgetvm->return = $update->call("v2", "device", "power", "post", $var);
            if ($budgetvm->return->success == true) {
                if ($_POST['bootorder'] != "standard" && !empty($budgetvm->bootorder) && $budgetvm->bootorder->success == true) {
                    // Power Action with custom boot order
                    $budgetvm->return->result = $budgetvm->bootorder->result . " & " . $budgetvm->return->result;
                }
            }
        } else {
            $budgetvm->return = NULL;
        }
        $powerStatus = new BudgetVM_Api($params['serverpassword']);
        $budgetvm->powerStatus = $powerStatus->call("v2", "device", "power", "get", $var);
        $serviceAction = 'get_usage';
        $templateFile = 'templates/power.tpl';
    } elseif ($requestedAction == 'reinstall') {
        if ($_SERVER['REQUEST_METHOD'] == "POST") {
            $cancel = $_POST['cancel'];
            if (isset($cancel) && $cancel == true) {
                $stop = new BudgetVM_Api($params['serverpassword']);
                $budgetvm->return = $stop->call("v2", "device", "reload", "delete", $var);
            } else {
                $provision = new BudgetVM_Api($params['serverpassword']);
                $var->post->value = $_POST['profile'];
                $budgetvm->return = $provision->call("v2", "device", "reload", "post", $var);
                if ($budgetvm->return->success == true) {
                    if ($type->result == "dedicated") {
                        $budgetvm->return->result = "System Reinstall Started</br>Root Password: "******"dedicated") {
            $status = new BudgetVM_Api($params['serverpassword']);
            $budgetvm->status = $status->call("v2", "device", "reload", "put", $var)->result;
        } else {
            $budgetvm->status = NULL;
        }
        $profiles = new BudgetVM_Api($params['serverpassword']);
        $budgetvm->profiles = $profiles->call("v2", "device", "reload", "get", $var)->result;
        $serviceAction = 'get_usage';
        $templateFile = 'templates/reinstall.tpl';
    } elseif ($requestedAction == 'ipmi') {
        if ($_SERVER['REQUEST_METHOD'] == "POST") {
            if ($type->result == "dedicated") {
                if ($_POST['ipmi_reset'] == true) {
                    $reset_ipmi = new BudgetVM_Api($params['serverpassword']);
                    $budgetvm->return = $reset_ipmi->call("v2", "device", "console", "delete", $var);
                } elseif ($_POST['ipmi_launch'] == true) {
                    $launch_ipmi = new BudgetVM_Api($params['serverpassword']);
                    $budgetvm->return = $launch_ipmi->call("v2", "device", "console", "get", $var);
                    if ($budgetvm->return->success == true) {
                        $launch_ipmi->ipmiLaunch(base64_decode($budgetvm->return->result));
                        $budgetvm->return->result = "KVM Launched, File download started.";
                    }
                } elseif ($_POST['image_unmount'] == true) {
                    $unmount_image = new BudgetVM_Api($params['serverpassword']);
                    $budgetvm->return = $unmount_image->call("v2", "device", "iso", "delete", $var);
                } elseif ($_POST['image_mount'] == true) {
                    $mount_image = new BudgetVM_Api($params['serverpassword']);
                    $var->post->image = $_POST['profile'];
                    $budgetvm->return = $mount_image->call("v2", "device", "iso", "post", $var);
                    $mount_image = new BudgetVM_Api($params['serverpassword']);
                    $budgetvm->return = $mount_image->call("v2", "device", "iso", "put", $var);
                }
            } else {
                if ($_POST['ipmi_vm_launch'] == true) {
                    $ipmi_vm_launch = new BudgetVM_Api($params['serverpassword']);
                    $budgetvm->return = $ipmi_vm_launch->call("v2", "device", "console", "get", $var);
                    if ($budgetvm->return->success == true) {
                        $message = "<h4>Management Console</h4>";
                        $message .= "Username: "******"</br>" . PHP_EOL;
                        $message .= "Password: "******"</br>" . PHP_EOL;
                        $message .= "Host: <a href='" . $budgetvm->return->result->host . "' target='_blank'>" . $budgetvm->return->result->host . "</a>" . PHP_EOL;
                        $budgetvm->return->result = $message;
                    }
                }
            }
        } else {
            $budgetvm->return = NULL;
        }
        $images = new BudgetVM_Api($params['serverpassword']);
        $budgetvm->images = $images->call("v2", "device", "iso", "get", NULL);
        $status = new BudgetVM_Api($params['serverpassword']);
        $budgetvm->status = $status->call("v2", "device", "iso", "get", $var);
        $serviceAction = 'get_usage';
        $templateFile = 'templates/ipmi.tpl';
    } else {
        // Service Overview
        if ($type->success == true) {
            $budgetvm->type = $type->result;
            if ($type->result == "dedicated") {
                $device = new BudgetVM_Api($params['serverpassword']);
                $device = $device->call("v2", "device", "hardware", "get", $var);
                $network = new BudgetVM_Api($params['serverpassword']);
                $network = $network->call("v2", "network", "netblock", "get", $var);
                if ($network->result == true) {
                    $budgetvm->network = $network->result;
                }
            } else {
                $device = new BudgetVM_Api($params['serverpassword']);
                $device = $device->call("v2", "device", "stats", "get", $var);
            }
            if ($device->success == true) {
                $budgetvm->device = $device->result;
            }
        }
        $var->post->start = strtotime("last Month");
        $var->post->end = strtotime("now");
        $bandwidth = new BudgetVM_Api($params['serverpassword']);
        $budgetvm->bandwidth = $bandwidth->call("v2", "network", "bandwidth", "post", $var);
        $status = new BudgetVM_Api($params['serverpassword']);
        $status = $status->call("v2", "device", "power", "get", $var);
        if ($status->success == true && $status->success == true) {
            $budgetvm->status = $status->result;
        } else {
            $budgetvm->status = "Uknown";
        }
        $serviceAction = 'get_stats';
        $templateFile = 'templates/overview.tpl';
    }
    try {
        // Call the service's function based on the request action, using the
        // values provided by WHMCS in `$params`.
        return array('tabOverviewReplacementTemplate' => $templateFile, 'templateVariables' => array('budgetvm' => $budgetvm));
    } catch (Exception $e) {
        // Record the error in WHMCS's module log.
        logModuleCall('provisioningmodule', __FUNCTION__, $params, $e->getMessage(), $e->getTraceAsString());
        // In an error condition, display an error page.
        return array('tabOverviewReplacementTemplate' => 'error.tpl', 'templateVariables' => array('usefulErrorHelper' => $e->getMessage()));
    }
}