<?php
/**
 * @file
 * Logger Overview form
 */

namespace Drupal\redis_logger\Form;


use Redis\Logger\Reader;

class Overview {

  /**
   * @var \Redis\Logger\Reader
   */
  protected $reader;

  public function __construct(Reader $reader) {
    $this->reader = $reader;
  }

  /**
   * Helper for the Redis logger filter form builder.
   *
   * @param \Redis\Logger\Reader $reader
   *
   * @return array
   */
  protected function getFilters() {
    $filters = array();

    $filters['type'] = array(
      'title' => t('Type'),
      'options' => $this->reader->getChannels(),
    );

    $filters['severity'] = array(
      'title' => t('Severity'),
      'options' => $this->reader->getSettings()->getSeverityLevels(),
    );

    return $filters;
  }

  /**
   * Form constructor for the form that clears out the log.
   *
   * TODO implement.
   *
   * @see dblog_clear_log_submit()
   * @ingroup forms
   */
  protected function buildClear(array $form) {
    $form['redis_logger_clear'] = array(
      '#type' => 'fieldset',
      '#title' => t('Clear log messages'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
    );
    $form['redis_logger_clear']['clear'] = array(
      '#type' => 'submit',
      '#value' => t('Clear log messages'),
      '#submit' => array('redis_logger_clear_log_submit'),
    );

    return $form;
  }

  /**
   * Build the filter form. Shares session status with DBLog.
   *
   * @param array $form
   * @param \Redis\Logger\Reader $reader
   *
   * @return array
   */
  protected function buildFilter(array $form) {
    $filters = $this->getFilters();

    $form['filters'] = array(
      '#type' => 'fieldset',
      '#title' => t('Filter log messages'),
      '#collapsible' => TRUE,
      '#collapsed' => empty($_SESSION['dblog_overview_filter']),
    );
    foreach ($filters as $key => $filter) {
      $form['filters']['status'][$key] = array(
        '#title' => $filter['title'],
        '#type' => 'select',
        '#multiple' => TRUE,
        '#size' => 8,
        '#options' => $filter['options'],
      );
      if (!empty($_SESSION['dblog_overview_filter'][$key])) {
        $form['filters']['status'][$key]['#default_value'] = $_SESSION['dblog_overview_filter'][$key];
      }
    }

    $form['filters']['actions'] = array(
      '#type' => 'actions',
      '#attributes' => array('class' => array('container-inline')),
    );
    $form['filters']['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Filter'),
      '#submit' => array('redis_logger_filter_submit'),
    );
    if (!empty($_SESSION['dblog_overview_filter'])) {
      $form['filters']['actions']['reset'] = array(
        '#type' => 'submit',
        '#value' => t('Reset'),
        '#submit' => array('redis_logger_filter_reset_submit'),
      );
    }
    return $form;
  }

  /**
   * Form builder.
   */
  public function build($form, &$form_state) {
    $reader = $this->reader;
    $severity_levels = $reader->getSettings()->getSeverityLevels();

    $base_form = $form;
    $form['redis_logger_filter_form'] = $this->buildFilter($base_form);
    $form['redis_logger_clear_log_form'] = $this->buildClear($base_form);

    $header = array(
      t('Level'),
      t('Count'),
      t('Type'),
      t('Source'), // file + line
      t('Message'),
    );

    $severity_classes = array(
      WATCHDOG_DEBUG => 'debug',
      WATCHDOG_INFO => 'info',
      WATCHDOG_NOTICE => 'notice',
      WATCHDOG_WARNING => 'warning',
      WATCHDOG_ERROR => 'error',
      WATCHDOG_CRITICAL => 'critical',
      WATCHDOG_ALERT => 'alert',
      WATCHDOG_EMERGENCY => 'emerg',
    );

    // TODO pager
    $templates = $reader->getTemplates();

    $regex = $reader->getSettings()->getSplittingRegex();
    $rows = array();
    foreach ($templates as $template) {
      preg_match($regex, $template, $matches);
      list(, $channel, $severity, $template) = $matches;
      $class = 'dblog-' . $severity_classes[$severity];
      $rows[] = array(
        'class' => array($class),
        'data' => array(
          array(
            'class' => 'icon',
            'data' => NULL,
            'title' => $severity . " = " . $severity_levels[$severity],
          ),
          rand(1, 100),
          $channel,
          'somefile.module+' . rand(1, 500),
          l($template, 'admin/reports/redis/logger/' . $template),
        ),
      );
    }

    $form['redis_logger_table'] = array(
      '#theme' => 'table',
      '#header' => $header,
      '#rows' => $rows,
      '#attributes' => array('id' => 'admin-dblog'),
      '#empty' => t('No log messages available.'),
    );

    $form_state['reader'] = $reader;
    return $form;
  }

  /**
   * Submit handler for Clear op.
   */
  public function submitClear($form, &$form_state) {
    $this->reader->clear();
  }

  /**
   * Submit handler for Apply Filter op.
   */
  public function submitFilter($form, &$form_state) {
    $_SESSION['dblog_overview_filter']['type'] = $_SESSION['dblog_overview_filter']['severity'] = array();
    if (isset($form_state['values']['type'])) {
      foreach ($form_state['values']['type'] as $channel) {
        $_SESSION['dblog_overview_filter']['type'][$channel] = $channel;
      }
    }
    if (isset($form_state['values']['severity'])) {
      foreach ($form_state['values']['severity'] as $severity) {
        $_SESSION['dblog_overview_filter']['severity'][$severity] = $severity;
      }
    }
  }

  /**
   * Submit handler for Filter reset op.
   */
  public function submitFilterReset($form, &$form_state) {
    $_SESSION['dblog_overview_filter'] = array();
  }
}