<?php
use Engelsystem\ValidationResult;

/**
 * Provide page/request helper functions
 */

/**
 * Parse a date from da day and a time textfield.
 *
 * @param string $date_name
 *          Name of the textfield containing the day (format Y-m-d)
 * @param string $time_name
 *          Name of the textfield containing the time (format H:i)
 * @param string[] $allowed_days
 *          List of allowed days in format Y-m-d
 * @param int $default_value
 *          Default value unix timestamp
 */
function check_request_datetime($date_name, $time_name, $allowed_days, $default_value) {
  $time = date("H:i", $default_value);
  $day = date("Y-m-d", $default_value);
  
  if (isset($_REQUEST[$time_name]) && preg_match('#^\d{1,2}:\d\d$#', trim($_REQUEST[$time_name]))) {
    $time = trim($_REQUEST[$time_name]);
  }
  if (isset($_REQUEST[$date_name]) && in_array($_REQUEST[$date_name], $allowed_days)) {
    $day = $_REQUEST[$date_name];
  }
  
  return parse_date("Y-m-d H:i", $day . " " . $time);
}

/**
 * Parse a date into unix timestamp
 *
 * @param string $pattern
 *          The date pattern (i.e. Y-m-d H:i)
 * @param string $value
 *          The string to parse
 * @return The parsed unix timestamp
 */
function parse_date($pattern, $value) {
  $datetime = DateTime::createFromFormat($pattern, trim($value));
  if ($datetime == null) {
    return null;
  }
  return $datetime->getTimestamp();
}

/**
 * Leitet den Browser an die übergebene URL weiter und hält das Script an.
 */
function redirect($url) {
  header("Location: " . $url, true, 302);
  raw_output("");
}

/**
 * Echoes given output and dies.
 *
 * @param String $output
 *          String to display
 */
function raw_output($output) {
  echo $output;
  die();
}

/**
 * Helper function for transforming list of entities into array for select boxes.
 *
 * @param array $data
 *          The data array
 * @param string $key_name
 *          name of the column to use as id/key
 * @param string $value_name
 *          name of the column to use as displayed value
 */
function select_array($data, $key_name, $value_name) {
  $ret = [];
  foreach ($data as $value) {
    $ret[$value[$key_name]] = $value[$value_name];
  }
  return $ret;
}

/**
 * Returns an int[] from given request param name.
 *
 * @param String $name
 *          Name of the request param
 * @param array<int> $default
 *          Default return value, if param is not set
 */
function check_request_int_array($name, $default = []) {
  if (isset($_REQUEST[$name]) && is_array($_REQUEST[$name])) {
    return array_filter($_REQUEST[$name], 'is_numeric');
  }
  return $default;
}

/**
 * Checks if given request item (name) can be parsed to a date.
 * If not parsable, given error message is put into msg() and null is returned.
 *
 * @param string $input
 *          String to be parsed into a date.
 * @param string $error_message
 *          the error message displayed if $input is not parsable
 * @param boolean $null_allowed
 *          is a null value allowed?
 * @return ValidationResult containing the parsed date
 */
function check_request_date($name, $error_message = null, $null_allowed = false) {
  if (! isset($_REQUEST[$name])) {
    return new ValidationResult($null_allowed, null);
  }
  return check_date($_REQUEST[$name], $error_message, $null_allowed);
}

/**
 * Checks if given string can be parsed to a date.
 * If not parsable, given error message is put into msg() and null is returned.
 *
 * @param string $input
 *          String to be parsed into a date.
 * @param string $error_message
 *          the error message displayed if $input is not parsable
 * @param boolean $null_allowed
 *          is a null value allowed?
 * @return ValidationResult containing the parsed date
 */
function check_date($input, $error_message = null, $null_allowed = false) {
  if ($tmp = parse_date("Y-m-d H:i", trim($input) . " 00:00")) {
    return new ValidationResult(true, $tmp);
  }
  if ($null_allowed) {
    return new ValidationResult(true, null);
  }
  
  error($error_message);
  return new ValidationResult(false, null);
}

/**
 * Returns REQUEST value filtered or default value (null) if not set.
 */
function strip_request_item($name, $default_value = null) {
  if (isset($_REQUEST[$name])) {
    return strip_item($_REQUEST[$name]);
  }
  return $default_value;
}

/**
 * Testet, ob der angegebene REQUEST Wert ein Integer ist, bzw.
 * eine ID sein könnte.
 */
function test_request_int($name) {
  if (isset($_REQUEST[$name])) {
    return preg_match("/^[0-9]*$/", $_REQUEST[$name]);
  }
  return false;
}

/**
 * Gibt den gefilterten REQUEST Wert mit Zeilenumbrüchen zurück
 */
function strip_request_item_nl($name, $default_value = null) {
  if (isset($_REQUEST[$name])) {
    return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+\n]{1,})/ui", '', strip_tags($_REQUEST[$name]));
  }
  return $default_value;
}

/**
 * Entfernt unerwünschte Zeichen
 */
function strip_item($item) {
  return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+]{1,})/ui", '', strip_tags($item));
}

/**
 * Überprüft eine E-Mail-Adresse.
 */
function check_email($email) {
  return (bool) filter_var($email, FILTER_VALIDATE_EMAIL);
}

?>