<?php
use Icinga\Data\Filter\Filter;
use Icinga\Module\Icingadb\Common\ServiceStates;
use Icinga\Web\Url;

if (! $this->compact): ?>
    <?= $this->controls ?>
<?php endif ?>
<div class="content" data-base-target="_next" id="<?= $this->protectId('content') ?>">
<?php if (empty($pivotData)): ?>
    <div class="item-list">
        <div class="empty-state-bar"><?= $this->translate('No services found matching the filter.') ?></div>
    </div>
</div>
<?php return; endif;
$hostFilter = Filter::matchAny();
foreach ($pivotData as $hostName => $_) {
    $hostFilter->orFilter(Filter::where('host.name', $hostName));
}
?>
    <table class="service-grid-table">
    <thead>
        <tr>
            <th><?= $this->partial(
                'joystickPagination-icingadb.phtml',
                'default',
                array(
                    'flippable'      => true,
                    'baseUrl'        => $baseUrl,
                    'xAxisPaginator' => $horizontalPaginator,
                    'yAxisPaginator' => $verticalPaginator
                )
            ); ?></th>
        <?php foreach ($pivotHeader['cols'] as $serviceDescription => $serviceDisplayName):?>
            <th class="rotate-45"><div><span><?= $this->qlink(
                $this->ellipsis($serviceDisplayName, 24),
                Url::fromPath('icingadb/services')->addFilter(
                    Filter::matchAll($hostFilter, Filter::where('service.name', $serviceDescription))
                ),
                null,
                array('title' => sprintf(
                    $this->translate('List all services with the name "%s" on all reported hosts'),
                    $serviceDisplayName
                )),
                false
            ) ?></span></div></th>
        <?php endforeach ?>
        </tr>
    </thead>
    <tbody>

    <?php $i = 0 ?>
    <?php foreach ($pivotHeader['rows'] as $hostName => $hostDisplayName): ?>
        <tr>
            <th><?php
                $serviceFilter = Filter::matchAny();
                foreach ($pivotData[$hostName] as $serviceName => $_) {
                    $serviceFilter->orFilter(Filter::where('service.name', $serviceName));
                }
                echo $this->qlink(
                    $hostDisplayName,
                    Url::fromPath('icingadb/services')->addFilter(
                        Filter::matchAll($serviceFilter, Filter::where('host.name', $hostName))
                    ),
                    null,
                    array('title' => sprintf($this->translate('List all reported services on host %s'), $hostDisplayName))
                );
            ?></th>
        <?php foreach (array_keys($pivotHeader['cols']) as $serviceDescription): ?>
            <td>
            <?php
            $service = $pivotData[$hostName][$serviceDescription];
            if ($service === null): ?>
                <span aria-hidden="true">&middot;</span>
            <?php continue; endif ?>
                <?php
                $ariaDescribedById = $this->protectId($service->host_name . '_' . $service->name . '_desc') ?>
                <span class="sr-only" id="<?= $ariaDescribedById ?>">
                    <?= $this->escape($service->state->output) ?>
                </span>
                <?= $this->qlink(
                    '',
                    'icingadb/service',
                    array(
                        'host.name'    => $hostName,
                        'name' => $serviceDescription
                    ),
                    array(
                        'aria-describedby'    => $ariaDescribedById,
                        'aria-label'          => sprintf(
                            $this->translate('Show detailed information for service %s on host %s'),
                            $service->display_name,
                            $service->host_display_name
                        ),
                        'class'               => 'service-grid-link state-' . $service->state->getStateText() . ($service->state->is_handled ? ' handled' : ''),
                        'title'               => $service->state->output
                    )
                ) ?>
            </td>
        <?php endforeach ?>
        <?php
        $horizontalTotalItems = $this->horizontalPaginator->count();
        $horizontalItemsPerPage = $this->horizontalPaginator->getLimit() ?? $horizontalTotalItems;
        $horizontalTotalPages = ceil($horizontalTotalItems / $horizontalItemsPerPage);

        $verticalTotalItems = $this->verticalPaginator->count();
        $verticalItemsPerPage = $this->verticalPaginator->getLimit() ?? $verticalTotalItems;
        $verticalTotalPages = ceil($verticalTotalItems / $verticalItemsPerPage);

        if (! $this->compact && $horizontalTotalPages > 1): ?>
            <td>
                <?php $expandLink = $this->qlink(
                    $this->translate('Load more'),
                    $baseUrl,
                    array(
                        'limit' => (
                                $horizontalItemsPerPage + 20) . ','
                             .  $verticalItemsPerPage
                    ),
                    array(
                        'class'             => 'action-link',
                        'data-base-target'  => '_self'
                    )
                ) ?>
                <?= ++$i === (int) (count($pivotHeader['rows']) / 2) ? $expandLink : '' ?>
            </td>
        <?php endif ?>
        </tr>
    <?php endforeach ?>
    <?php if (! $this->compact && $verticalTotalPages > 1): ?>
        <tr>
            <td colspan="<?= count($pivotHeader['cols']) + 1?>" class="service-grid-table-more">
                <?php echo $this->qlink(
                    $this->translate('Load more'),
                    $baseUrl,
                    array(
                        'limit' => $horizontalItemsPerPage . ',' .
                            ($verticalItemsPerPage + 20)
                    ),
                    array(
                        'class'             => 'action-link',
                        'data-base-target'  => '_self'
                    )
                ) ?>
            </td>
        </tr>
    <?php endif ?>
    </tbody>
    </table>
</div>
