<?php
namespace Lagdo\Supervisor\Ajax;
use Lagdo\Supervisor\Package as SupervisorPackage;
use Lagdo\Supervisor\Client as SupervisorClient;
use Jaxon\CallableClass;
use Exception;
/**
 * Supervisor Ajax client
 */
class Client extends CallableClass
{
    /**
     * The Jaxon Supervisor package
     *
     * @var SupervisorPackage
     */
    protected $package;
    /**
     * The Supervisor client
     *
     * @var SupervisorClient
     */
    protected $client;
    /**
     * The constructor
     *
     * @param SupervisorPackage $package    The Supervisor package
     * @param SupervisorClient  $client     The Supervisor client
     */
    public function __construct(SupervisorPackage $package, SupervisorClient $client)
    {
        $this->package = $package;
        $this->client = $client;
    }
    /**
     * Refresh data from all the servers
     *
     * @return \Jaxon\Response\Response
     */
    public function refreshAll()
    {
        $options = $this->package->getOptions();
        $servers = \array_keys($options['servers']);
        $actions = [];
        foreach($servers as $server)
        {
            // Add a request for the server in the response
            $this->response->script($this->rq()->refresh($server));
        }
        // Refresh the statuses after a given interval
        $this->response->script('jaxon.supervisor.enableRefresh()');
        return $this->response;
    }
    /**
     * Refresh data from a server
     *
     * @param string $server    The server name in the configuration
     *
     * @return \Jaxon\Response\Response
     */
    public function refresh($server)
    {
        $server = trim($server);
        // The id of the div element for the Supervisor instance
        $divId = $this->package->divId($server);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $version = $this->client->getVersion($serverOptions);
            $processes = $this->client->getProcesses($serverOptions);
        }
        catch(Exception $e)
        {
            $version = 'Error';
            $processes = [];
        }
        $template = 'lagdo::supervisor::views/bootstrap/server';
        $content = $this->view()->render($template, compact('server', 'version', 'processes'));
        // Insert the server HTML content in the page
        $this->response->html($divId, $content);
        // Set handlers on server buttons
        $this->jq('.jaxon-supervisor-server>a.btn-start', "#$divId")
            ->click($this->rq()->startAll(jq()->parent()->attr('data-s')));
        $this->jq('.jaxon-supervisor-server>a.btn-stop', "#$divId")
            ->click($this->rq()->stopAll(jq()->parent()->attr('data-s')));
        $this->jq('.jaxon-supervisor-server>a.btn-restart', "#$divId")
            ->click($this->rq()->restartAll(jq()->parent()->attr('data-s')));
        // Set handlers on process buttons
        $this->jq('.jaxon-supervisor-process>a.btn-start', "#$divId")
            ->click($this->rq()->start(jq()->parent()->attr('data-s'), jq()->parent()->attr('data-p')));
        $this->jq('.jaxon-supervisor-process>a.btn-stop', "#$divId")
            ->click($this->rq()->stop(jq()->parent()->attr('data-s'), jq()->parent()->attr('data-p')));
        $this->jq('.jaxon-supervisor-process>a.btn-restart', "#$divId")
            ->click($this->rq()->restart(jq()->parent()->attr('data-s'), jq()->parent()->attr('data-p')));
        return $this->response;
    }
    /**
     * Start all the processes on a server
     *
     * @param string $server    The server name in the configuration
     *
     * @return \Jaxon\Response\Response
     */
    public function startAll($server)
    {
        $server = trim($server);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $this->client->startAllProcesses($serverOptions);
            return $this->refresh($server);
        }
        catch(Exception $e)
        {
            $this->response->dialog->error("Unable to start all processes on server $server", 'Error');
            return $this->response;
        }
    }
    /**
     * Restart all the processes on a server
     *
     * @param string $server    The server name in the configuration
     *
     * @return \Jaxon\Response\Response
     */
    public function restartAll($server)
    {
        $server = trim($server);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $this->client->restartAllProcesses($serverOptions);
            return $this->refresh($server);
        }
        catch(Exception $e)
        {
            $this->response->dialog->error("Unable to restart all processes on server $server", 'Error');
            return $this->response;
        }
    }
    /**
     * Stop all the processes on a server
     *
     * @param string $server    The server name in the configuration
     *
     * @return \Jaxon\Response\Response
     */
    public function stopAll($server)
    {
        $server = trim($server);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $this->client->stopAllProcesses($serverOptions);
            return $this->refresh($server);
        }
        catch(Exception $e)
        {
            $this->response->dialog->error("Unable to stop all processes on server $server", 'Error');
            return $this->response;
        }
    }
    /**
     * Start a process on a server
     *
     * @param string $server    The server name in the configuration
     * @param string $process       The process identifier
     *
     * @return \Jaxon\Response\Response
     */
    public function start($server, $process)
    {
        $server = trim($server);
        $process = trim($process);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $this->client->startProcess($serverOptions, $process);
            return $this->refresh($server);
        }
        catch(Exception $e)
        {
            $this->response->dialog->error("Unable to start process $process on server $server", 'Error');
            return $this->response;
        }
    }
    /**
     * Restart a process on a server
     *
     * @param string $server    The server name in the configuration
     * @param string $process       The process identifier
     *
     * @return \Jaxon\Response\Response
     */
    public function restart($server, $process)
    {
        $server = trim($server);
        $process = trim($process);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $this->client->restartProcess($serverOptions, $process);
            return $this->refresh($server);
        }
        catch(Exception $e)
        {
            $this->response->dialog->error("Unable to restart process $process on server $server", 'Error');
            return $this->response;
        }
    }
    /**
     * Stop a process on a server
     *
     * @param string $server    The server name in the configuration
     * @param string $process       The process identifier
     *
     * @return \Jaxon\Response\Response
     */
    public function stop($server, $process)
    {
        $server = trim($server);
        $process = trim($process);
        $options = $this->package->getOptions();
        if(!\key_exists('servers', $options) || !\key_exists($server, $options['servers']))
        {
            $this->response->dialog->error("No config entry for server with name $server", 'Error');
            $this->response->html($divId, "No config entry for server with name $server");
            return $this->response;
        }
        $serverOptions = $options['servers'][$server];
        try
        {
            $this->client->stopProcess($serverOptions, $process);
            return $this->refresh($server);
        }
        catch(Exception $e)
        {
            $this->response->dialog->error("Unable to stop process $process on server $server", 'Error');
            return $this->response;
        }
    }
}
 
  |